抽象工厂模式
抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类
允许使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么,这样就可以从具体产品中被解耦,解决了工厂模式的每个工厂只能创建一类产品
优点:降低耦合,抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展
更符合开-闭原则,新增一种产品类时,只需要增加相应的具体产品类和相应的工厂子类即可
符合单一职责原则,每个具体工厂类只负责创建对应的产品
不使用静态工厂方法,可以形成基于继承的等级结构
缺点:对于新的产品族符合开-闭原则;对于新的产品种类不符合开-闭原则,这一特性称为开-闭原则的倾斜性
//抽象工厂类
interface Factory{
public function ManufactureContainer();
public function ManufactureMould();
}
//抽象产品族
interface AbstractProduct{
public function Show();
}
//抽象产品类A
interface ContainerProduct extends AbstractProduct{
public function Show();
}
//抽象产品类B
interface MouldProduct extends AbstractProduct{
public function Show();
}
//具体产品类
class ContainerProductA implements ContainerProduct{
public function Show(){
echo '生产出容器A产品';
}
}
class ContainerProductB implements ContainerProduct{
public function Show(){
echo '生产出容器B产品';
}
}
class MouldProductA implements MouldProduct{
public function Show(){
echo '生产出磨具A产品';
}
}
class MouldProductB implements MouldProduct{
public function Show(){
echo '生产出磨具B产品';
}
}
//具体工厂类
class FactoryA implements Factory{
public function ManufactureContainer() {
return new ContainerProductA();
}
public function ManufactureMould() {
return new MouldProductA();
}
}
//B厂 - 生产模具+容器产品
class FactoryB implements Factory{
public function ManufactureContainer() {
return new ContainerProductB();
}
public function ManufactureMould() {
return new MouldProductB();
}
}