2020-08-10

AbstractFactoryPattern抽象工厂模式

抽象工厂模式

1.定义

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。

以女娲造人为例,定义人种(Product产品类)及八卦炉(工厂类)。为人类定义肤色及性别属性,从设计角度看,一个具体的对象可以通过肤色及性别确定。生产的工厂类如果只有一个,生产出来的全都是男性或者女性,因此需要拆分为两个工具类。

人类接口

public interface Human { // 每个人都有肤色	 void getColor(); // 每个人都有性别 void getSex();}

抽象人种类(根据肤色划分)

/* * 白色人种 */public abstract class AbstractWhiteHuman implements Human { public void getColor() {  	System.out.println("白色人种皮肤是白色的") }}/* * 黑色人种 */public abstract class AbstractBlackHuman implements Human { public void getColor() {  	System.out.println("黑色人种皮肤是黑色的") }}/* * 黄色人种 */public abstract class AbstractYellowHuman implements Human { public void getColor() {  	System.out.println("黄色人种皮肤是黄色的") }}

具体人类(产品类实现类),每个抽象类都有两个实现类(男人和女人),实现性别的定义,以黄色人种为例

public class FemaleYellowHuman extends AbstractYellowHuman { public void getSex() {  	System.out.println("女性黄种人") }}public class MaleYellowHuman extends AbstractYellowHuman { public void getSex() {  	System.out.println("男性黄种人") }}

其它的黑色人种与白色人种的代码与此类似,不再重复编写。到此所有的人种(产品类)已定义完毕,接下来需要定义八卦炉(工厂类)生产人类。

八卦炉接口

public interface HumanFactory { Human createYelloHuman();  Human createBlackHuman();  Human createWhiteHuman();}

具体八卦炉(工厂实现类),按性别分为男性八卦炉及女性八卦炉

public class FemaleFactory implements HumanFactory { public Human createYelloHuman() {  	return new FemaleYelloHuman(); }  public Human createBlackHuman() {  	return new FemaleBlackHuman(); }  public Human createWhiteHuman() {  	return new FemaleWhiteHuman(); }}public class MaleFactory implements HumanFactory { public Human createYelloHuman() {  	return new MaleYelloHuman(); }  public Human createBlackHuman() {  	return new MaleBlackHuman(); }  public Human createWhiteHuman() {  	return new MaleWhiteHuman(); }}

造人(场景类)

public class Client { public static void main(String[] args) {  	HumanFactory maleHumanFactory = new MaleFactory();  	HumanFactory femaleHumanFactory = new FemaleFactory();    	Human maleYellowHuman = maleHumanFactory.createYelloHuman();  Human maleBlackHuman = maleHumanFactory.createBlackHuman();  	Human maleWhiteHuman = maleHumanFactory.createWhiteHuman();   	Human femaleYellowHuman = femaleHumanFactory.createYelloHuman();  Human femaleBlackHuman = femaleHumanFactory.createBlackHuman();  	Human femaleWhiteHuman = femaleHumanFactory.createWhiteHuman(); }}

抽象工厂模式是工厂方法模式的升级,在有多个业务品种,业务分类时,通过抽象工厂模式产生需要的对象。如果将八卦炉(工厂类)比喻为车间,那八卦炉的类型(人种性别)可以称作产品等级,八卦炉的生产工艺(人种肤色)可以称作产品线或产品族。抽象工厂类的职责是定义每个工厂要实现的功能即产品线,有M个产品等级就应该有M个八卦炉(工厂实现类),有N个产品线,在八卦炉(抽象工厂类)中就应该有N个生产线(创建方法)。在场景类中,没有任何一个方法与产品实现类有关系,对于一个产品来说,只需要知道它的工厂方法就可以直接生产一个产品对象,无需关心它的实现类。

2.应用

2.1 优点

  • 封装性。每个产品的实现类不是高层模块关心的,它关心的是接口,是抽象。只要知道工厂类,就可以创造出一个需要的对象。

2.2 缺点

  • 产品族扩展困难。增加新的产品线,抽象工厂类需要增加新的抽象方法,且所有的工厂实现类都要修改。

2.3 使用场景

一组没有任何关系的对象具有相同的约束,则可以使用抽象工厂模式。一个视频编辑器及音频编辑器,在unix和windows操作系统中虽然功能和界面都相同,但代码的实现不同。也就是所说的具有共同的约束条件(操作系统)。因此可使用抽象工厂模式,产生不同操作系统下的视频及音频处理器。

2.4 注意事项

在抽象工厂模式的缺点中所说的是产品族扩展困难,而不是产品等级扩展困难。扩展产品等级只需要增加一个新的工厂实现类即可,也就是横向扩展容易,纵向扩展困难。

AbstractFactoryPattern抽象工厂模式easy buy声网多账户运营迷你风流行!亚马逊上这个趋势已经出现亚马逊日本站秒杀手动报名开始了_日本站秒杀活动介绍亚马逊产品影响转换率的因素有哪些?听说2017年中考和高考的学生凭证可优惠去盘龙峡漂流,是真的吗?暑假去盘龙峡漂流好不好?盘龙峡漂流好不好玩?顺德长鹿农庄在哪?怎么去?

No comments:

Post a Comment