一、形象工厂办法模式介绍

1. 解决的问题

通过接口的抉择,解决在零碎产品存在多个产品族,而零碎仅生产某一族的产品的问题。

2. 定义

形象工厂模式是一个围绕超级工厂创立其余工厂的模式,即形象工厂是一个核心工厂,创立其余工厂的模式。

形象工厂提供了一个接口,可用于创立每个系列产品的对象。只有代码通过该接口创建对象,那么就不会生产与以后零碎已生成的产品类型不统一的产品。

二、形象工厂办法模式优缺点

1. 长处

  • 能够确保同一工厂生产的产品互相匹配。
  • 能够防止客户端和具体产品代码的耦合。
  • 繁多职责准则:将产品生成代码抽取到同一地位,使得产品代码易于保护。
  • 开闭准则:向应用程序引入新产品变体时,无需批改客户端代码。

2. 毛病

  • 因为采纳该模式须要向利用中引入泛滥接口和类,代码可能会比之前更加简单。

三、形象工厂办法模式利用实例:QQ 厘米秀打扮

1. 实例场景

QQ 陪伴咱们了 22 年,从 QQ 秀到厘米秀,二维图片到三维平面集体秀,接下来咱们以厘米秀的各种打扮作为模仿场景。

以厘米秀的两种套装格调作为示例:

  • 古代风:帽子、西装、西裤、皮鞋
  • 复古风:礼帽、大衣、长裤、长靴

2. 形象工厂办法模式实现

2.1 工程构造
abstract-factory-pattern└─ src    ├─ main    │    └─ java    │    └─ org.design.pattern.abstract_factory    │       ├─ model    │       │  └─ hat    │       │  │    ├─ Hat.java    │       │  │    ├─ ModernHat.java    │       │  │    └─ RetroHat.java    │       │  └─ coat    │       │  │    ├─ Coat.java    │       │  │    ├─ ModernCoat.java    │       │  │    └─ RetroCoat.java    │       │  └─ pants    │       │  │    ├─ Pants.java    │       │  │    ├─ ModernPants.java    │       │  │    └─ RetroPants.java    │       │  └─ shoes    │       │          ├─ Shoes.java    │       │          ├─ ModernShoes.java    │       │          └─ RetroShoes.java    │       ├─ factory    │       │    ├─ SuitFactory.java    │       │    ├─ ModernSuitFactory.java    │       │    └─ RetroSuitFactory.java    │       |               │       └─ service    │           ├─ CmShowService.java    │           └─ CmShowServiceImpl.java    └─ test        └─ java            └─ org.design.pattern.abstract_factory.test                  └─ CmShowServiceTest.java
2.2 代码实现
2.2.1 根底服饰

帽子

/** * 帽子 */public interface Hat {    void getStyle();}

古代风帽子

/** * 古代风帽子 */public class ModernHat implements Hat {    @Override    public void getStyle() {        System.out.println("古代风帽子");    }}

复古风帽子

/** * 复古风帽子 */public class RetroHat implements Hat {    @Override    public void getStyle() {        System.out.println("复古风礼帽");    }}
2.2.2 打扮套装工厂类

套装工厂

/** * 套装工厂 */public interface SuitFactory {    Hat createHat();    Coat createCoat();    Pants createPants();    Shoes createShoes();}

古代风套装工厂

/** * 古代风套装工厂 */public class ModernSuitFactory implements SuitFactory {    @Override    public Hat createHat() {        return new ModernHat();    }    @Override    public Coat createCoat() {        return new ModernCoat();    }    @Override    public Pants createPants() {        return new ModerPants();    }    @Override    public Shoes createShoes() {        return new ModernShoes();    }}

复古风套装工厂

/** * 复古风套装工厂 */public class RetroSuitFactory implements SuitFactory {    @Override    public Hat createHat() {        return new RetroHat();    }    @Override    public Coat createCoat() {        return new RetroCoat();    }    @Override    public Pants createPants() {        return new RetroPants();    }    @Override    public Shoes createShoes() {        return new RetroShoes();    }}
2.3 测试验证
2.3.1 编写测试类
public class CmShowServiceTest {    @Test    public void getModernSuitCmShow() {        SuitFactory suitFactory = new ModernSuitFactory();        CmShowService cmShowService = new CmShowServiceImpl(suitFactory);        cmShowService.getSuitStyle();    }    @Test    public void getRetroSuitCmShow() {        SuitFactory suitFactory = new RetroSuitFactory();        CmShowService cmShowService = new CmShowServiceImpl(suitFactory);        cmShowService.getSuitStyle();    }}
2.3.2 测试后果
古代风厘米秀:古代风帽子古代风西装古代风西裤古代风鞋子复古风厘米秀:复古风礼帽复古风大衣复古风长裤复古风长靴

四、形象工厂办法模式构造

  1. 形象产品 (Abstract Product) 为形成系列产品的一组不同但相干的产品申明接口。
  2. 具体产品 (Concrete Product) 是形象产品的多种不同类型实现。 所有变体 ( 古代风/复古风) 都必须实现相应的形象产品 (帽子/上衣)。
  3. 形象工厂 (Abstract Factory) 接口申明了一组创立各种形象产品的办法。
  4. 具体工厂 (Concrete Factory) 实现形象工厂的构建办法。 每个具体工厂都对应特定产品变体, 且仅创立此种产品变体。
  5. 只管具体工厂会对具体产品进行初始化, 其构建办法签名必须返回相应的形象产品。 这样, 应用工厂类的客户端代码就不会与工厂创立的特定产品变体耦合。 服务 (Service) 只需通过形象接口调用工厂和产品对象, 就能与任何具体工厂/产品变体交互。

设计模式并不难学,其自身就是多年教训提炼出的开发指导思想,关键在于多加练习,带着应用设计模式的思维区优化代码,就能构建出更正当的代码。

源码地址:https://github.com/yiyufxst/d...

参考资料:
小博哥重学设计模式:https://github.com/fuzhengwei...
深刻设计模式:https://refactoringguru.cn/de...