`

富足的抽象工厂模式(Abstract Factory Pattern)

阅读更多

如果把工厂方法模式看作是小厂的作风,那抽象工厂模式绝对是土豪,因为它具有多个业务品种,工厂富足了!

 

抽象工厂模式的官方定义为:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。

 

抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

在工厂模式的例子中,可以出产出超级用户和普通用户,如果现在在此基础上区分性别,该如何?

如图所示,同样定义一个公共接口User,再定义两个子抽象类abstractSuperUser和abstractCommonUser,分别对应为超级用户和普通用户抽象类,再分别定义其子类以区分性别。

同时定义一个公共接口UserFactory,内置createSuperUser和createCommonUser分别生产超级用户和普通用户,再分别定义其子类以区分性别。实现代码如下:

<?php
interface userFactory {
	public function createSuperUser();
	public function createCommonUser();
}

class maleUserFactory implements userFactory{
	public function createSuperUser() {
		return new superMaleUser();
	}

	public function createCommonUser(){
		return new commonMaleUser();
	}
}

class femaleUserFactory implements userFactory{
	public function createSuperUser() {
		return new superFemaleUser();
	}

	public function createCommonUser(){
		return new commonFemaleUser();
	}
}



interface User{
	public function getGrade();
}

abstract class abstractSuperUser implements User{
	public function getGrade() {
		echo '超级用户';
	}
}

abstract class abstractCommoUser implements User{
	public function getGrade() {
		echo '普通用户';
	}
}

class superMaleUser extends abstractSuperUser{
	public function getSex(){
		echo "超级男性用户\n";
	}
}

class superFemaleUser extends abstractSuperUser{
	public function getSex(){
		echo "超级女性用户\n";
	}
}

class commonMaleUser extends abstractCommoUser{
	public function getSex(){
		echo "普通男性用户\n";
	}
}

class commonFemaleUser extends abstractCommoUser{
	public function getSex(){
		echo "普通女性用户\n";
	}
}

$maleUserFactory = new maleUserFactory();
$maleUserFactory->createSuperUser()->getSex();
$maleUserFactory->createCommonUser()->getSex();

$femaleUserFactory = new femaleUserFactory();
$femaleUserFactory->createSuperUser()->getSex();
$femaleUserFactory->createCommonUser()->getSex();

?>
运行结果:
超级男性用户
普通男性用户
超级女性用户
普通女性用户
[Finished in 0.1s]

 
 抽象工厂模式的优点:

1、封装性,每个产品的实现类不是高层模块要关心的,它要关心的是接口,是抽象。它不关心对象是如何创建出来。只要知道工厂类是谁,就能创建出一个需要的对象,省时省力。

2、产品族内的决定为非公开状态。生产过程对调用工厂类的高层模块来说是透明的,它不需要知道这个约束,具体的产品族内的约束是在工厂内实现的。

 

抽象工厂模式的缺点:

抽象工厂模式的最大缺点就是产品族扩展非常困难。以上面例子为例,如果现在要增加一个介于超级与普通用户之间的特殊用户,看看程序有多大的改动吧,userFactory接口新增一个createSpecialUser方法用于创建特殊用户,其下面所有子类都要同样修改,这严重违反了开闭原则,而且我们一直说明抽象类和接口是一个契约。改变契约,所有与契约有关系的代码都要修改,那么这段代码叫什么?叫“有毒代码”——只要与这段代码有关系,就可能产生侵害的风险!

 

抽象工厂模式的使用场景:

抽象工厂模式的使用场景定义,一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。例如一个文本编辑器和一个图片处理器,都是软件实体,但是linux下的文体编辑器和 windows下的文体编辑器虽然功能和界面都相同,但是代码实现是不同的,图片处理器也是类似情况。也就是具有了共同的约束条件,操作系统类型。于是就可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。

 

抽象工厂模式的注意事项:

在上面提到的缺点中,说到抽象工厂模式的产品族扩展比较困难,但是一定要清楚,是产品族扩展困难,而不是产品等级。在该模式下,产品等级是非常容易扩展的,增加一个产品等级,只要增加一个工厂类负责新增出来的产品任务即可。也就是横向扩展容易,纵向扩展困难。以上面User的例子,产品等级中只有男、女两个性别,现实世界还有一种性别:双性人,那要扩展这个产品等级也是非常容易的,增加两个产品类,分别对应不同的等级,然后再创建一个工厂类,专门负责不同等级人的双性人的创建任务,完全通过扩展来实现需求的变更,从这一点上看,抽象工厂模式是符合开闭原则的。

 

3
5
分享到:
评论

相关推荐

    创建型模式之抽象工厂模式(Abstract Factory Pattern)

    3、抽象工厂模式(Abstract Factory Pattern) 用意:一个工厂生产一系列产品

    抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 引入: 在前面介绍的两个创建型模式里面,我们解决的都是有关"new"的问题,用它们来避免显式指定类创建对象。我写的也非常简单易懂,相信看过的朋友们都应该对简单工厂...

    创建型-抽象工厂模式(Abstract Factory)

    抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

    设计模式 之 “抽象工厂模式[Abstract Factory Pattern]”

    NULL 博文链接:https://lym6520.iteye.com/blog/701742

    [创建型模式] 设计模式之抽象工厂模式(Abstract Factory Pattern)

    NULL 博文链接:https://jacky-dai.iteye.com/blog/2294531

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式FACADE PATTERN 8、适配器模式ADAPTER PATTERN 9、模板方法模式TEMPLATE METHOD PATTERN 10、建造者模式BUILDER PATTERN 11、桥梁模式BRIDGE PATTERN 12、...

    设计模式_抽象工厂模式.zip

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责...

    Python设计模式之抽象工厂模式原理与用法详解

    抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类 下面是一个抽象工厂的demo: #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'Andy' 大话...

    24种设计模式与6大设计原则

    抽象工厂模式[ABSTRACT FACTORY PATTERN] 门面模式[FACADE PATTERN] 适配器模式[ADAPTER PATTERN] 模板方法模式[TEMPLATE METHOD PATTERN] 建造者模式[BUILDER PATTERN] 策略模式 代理模式 单例模式 多例模式 工厂...

    C#版 24种设计模式

    备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor ...

    abstract-factory-pattern

    Java抽象工厂模式:解锁代码复用的新境界 在编程世界中,设计模式是一组被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它们能够帮助我们更好地组织代码,提高代码的可重用性、可维护性和可扩展性...

    用Java实现23种设计模式

    抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) 2. 结构型模式 适配器模式(Adapter Pattern) 桥接模式(Bridge ...

    Abstract Factory Pattern.docx

    工厂设计模式,非常详细的设计模式文档,欢迎大家下载

    python 抽象工厂模式(示例)

    # 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。# 该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。# 在抽象工厂模式中,接口是...

    设计模式PPT

     抽象工厂模式(Abstract Factory Pattern)  建造者模式(Builder Pattern)  原型模式(Prototype Pattern)  单例模式(Singleton Pattern) 结构型模式用来处理类或者对象的组合,主要包含以下7种设计...

    33种JAVA设计模式DEMO

    抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) 2 结构型模式 这些设计模式关注类和对象的组合。继承的概念被用来组合接口...

    C#设计模式_设计模式_C#_

    抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator ...

    C#设计模式(23种设计模式)

    抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰...

    Java设计模式,并加上个人理解

    5. 抽象工厂模式 (Abstract Factory) 6. 策略模式 (Strategy Pattern) 7. 适配器模式 (Adapter Pattern) 8. 模板方法模式 (Template Pattern) 9. 建造者模式 (Builder Pattern) 10. 原型模式 (Prototype ...

    C++设计模式(Design Pattern)范例源代码

    抽象工厂模式(Abstract Factory) 生成器模式(Builder) 工厂方法模式(Factory Method) 原型模式(Prototype) 单件模式(Singleton) 结构型: 适配器模式(Adapter) 桥接模式(Bridge) 组合模式(Composite) 装饰者模式...

Global site tag (gtag.js) - Google Analytics