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 注意事项

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

(0)

相关推荐

  • Java设计模式之003--工厂模式

    工厂模式(Factory Pattern) 是 Java 中最常用的设计模式之一. 这种类型的设计模式属于创建型模式, 它提供了一种创建对象的最佳方式. 在工厂模式中, 我们在创建对象时不会对客户端暴 ...

  • 【设计模式】简单工厂模式

    定义 通过工厂类提供的方法,创建不同的派生类 通常创建的类都具有共同的基类/接口 优缺点 优点 客户端与具体的实现类解耦 缺点 新增产品需要修改原来工厂类的方法,不符合开闭原则 角色 客户端 --&g ...

  • 【8/25】使用抽象工厂模式(Abstract Factory Pattern) 封装页面对象的创建过程

    这是<小游戏从0到1设计模式重构>系列内容第8篇,所有源码及资料在"程序员LIYI"公号回复"小游戏从0到1"获取. 看完了三姐妹中的大姐.二姐,最 ...

  • PHP设计模式之抽象工厂模式

    PHP设计模式之抽象工厂模式 工厂模式系列中的重头戏来了,没错,那正是传闻中的抽象工厂模式.初次听到这个名字的时候你有什么感觉?反正我是感觉这货应该是非常高大上的,毕竟包含着"抽象" ...

  • [PHP小课堂]PHP设计模式之抽象工厂模式

    [PHP小课堂]PHP设计模式之抽象工厂模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 设计模式——把类作为参数的抽象工厂模式

    今天给大家介绍一个非常简单的设计模式,一学就会,非常好用. 这个模式叫做抽象工厂模式,大家可能对工厂模式比较熟悉,在工厂模式当中封装了实例的创建逻辑.主要的用途一般是将一些复杂的类的创建过程整合在一起 ...

  • 【重温设计模式】之004抽象工厂模式

    [重温设计模式系列源码] 抽象工厂模式 基本原理 含义 抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口, 而无须指定它们具体的类:具体的工 ...

  • 手绘抽象工厂模式

    手绘抽象工厂模式

  • 设计模式-创建型-抽象工厂模式

    前一章节,我们介绍了简单工厂模式以及工厂方法模式,但是这两种模式都存在一定的局限性,只能生产某一类型下的某一种产品,如果需求变更,同类型下出现了不同的产品,比如芝士披萨不仅有口味上的不同,同时存在外观 ...

  • 创建型设计模式--工厂模式、抽象工厂模式

    一.小案例分析 1.功能需求: 实现一个发送信息的功能,要便于扩展与维护. (1)发送信息的工具有很多,比如短信.微信.邮件.QQ等. (2)选择某个工具进行信息发送. 2.小菜鸡去实现: (1)定义 ...

  • 抽象工厂模式

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