一、形象工厂办法模式介绍
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 测试后果
古代风厘米秀:古代风帽子
古代风西装
古代风西裤
古代风鞋子
复古风厘米秀:复古风礼帽
复古风大衣
复古风长裤
复古风长靴
四、形象工厂办法模式构造
- 形象产品(Abstract Product)为形成系列产品的一组不同但相干的产品申明接口。
- 具体产品(Concrete Product)是形象产品的多种不同类型实现。所有变体(古代风 / 复古风)都必须实现相应的形象产品(帽子 / 上衣)。
- 形象工厂(Abstract Factory)接口申明了一组创立各种形象产品的办法。
- 具体工厂(Concrete Factory)实现形象工厂的构建办法。每个具体工厂都对应特定产品变体,且仅创立此种产品变体。
- 只管具体工厂会对具体产品进行初始化,其构建办法签名必须返回相应的 形象 产品。这样,应用工厂类的客户端代码就不会与工厂创立的特定产品变体耦合。服务(Service)只需通过形象接口调用工厂和产品对象,就能与任何具体工厂 / 产品变体交互。
设计模式并不难学,其自身就是多年教训提炼出的开发指导思想,关键在于多加练习,带着应用设计模式的思维区优化代码,就能构建出更正当的代码。
源码地址:https://github.com/yiyufxst/d…
参考资料:
小博哥重学设计模式:https://github.com/fuzhengwei…
深刻设计模式:https://refactoringguru.cn/de…