设计模式-抽象工厂模式
0x00 抽象工厂模式定义
Provide an interface or creating families of related or dependent objects without specifying their concrete classes
(为创建一组相关或相互依赖的对象提供一个接口, 而且无须指定它们的具体类。)
抽象工厂模式的通用类图:


区别于工厂方法模式
子工厂必须全部继承或实现自同一个抽象类或接口.
每个工厂必须包含多个工厂方法.
每个工厂的方法必须一致
优点
封装性, 每个产品的实现类不是高层模块需要关心的, 它只关心接口和抽象,它不关心对象是如何创建出来。只要知道工厂类是谁,就能创建出来一个需要的对象。
产品族内约束是非公开状态, 是在工厂内实现的。
使用场景
一个对象族都有相同的约束,就可以使用抽象工厂模式. 比如 php 在 linux 和 windows 下面的运行效果看上去一样,也就是相当于有一样的约束条件: 操作系统类型。那么就可以使用抽象工厂模式, 产生不同操作系统下的 php 安装途径。
PHP 实现1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
abstract class population {}
abstract class income {}
class ShenzhenPopulation {}
class ShenzhenIncome {}
class BeijingPopulation {}
class BeijingIncome {}
interface NationalStatisticsAbstractFactory {
public function statisticsPopulation();
public function statisticsIncome();
}
class ShenzhenFactory implements NationalStatisticsAbstractFactory {
public function statisticsPopulation() {
return new ShenzhenPopulation();
}
public function statisticsIncome() {
return new ShenzhenIncome();
}
}
class BeijingFactory implements NationalStatisticsAbstractFactory {
public function statisticsPopulation (){
return new BeijingPopulation();
}
public function statisticsIncome () {
return new BeijingIncome();
}
}
深圳工厂和北京的工厂类(ShenzhenFactory, BeijingFactory)都继承自 国家统计抽象接口(NationalStatisticsAbstractFactory), ShenzhenFactory 和 BeijingFactory 都分别包含统计收入(statisticsIncome)和统计人口(statisticsPopulation)的方法.