设计模式之抽象工厂模式
上次对工厂模式进行了学习,了解到了类型接口,uml图,包括示例代码等相关部分,刚好趁热打铁,对抽象工厂模式进行了学习
一 : 含义 什么是抽象工厂模式 ?
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
二 : 解决的问题
每个工厂只能创建一类产品(工厂模式的缺点)
三: 模式原理
3.1模式的结构
3.3 优缺点
优点:
- 更符合开-闭原则
- 符合单一职责原则。
- 降低耦合
- 不使用静态工厂方法,可以形成基于继承的等级结构。
缺点:
增加新的等级结构麻烦, 需要对原有系统进行较大的修改, 甚至需要修改抽象层代码,这显然会带来较大的不便, 违背了“开闭原则”。
扩展 : 对于新的产品族符合开-闭原则;对于新的产品种类不符合开-闭原则,这一特性称为开-闭原则的倾斜性。
四 实现代码
步骤一 : 创建顶级抽象产品
* @Description 抽象产品 : 玩具
* @createTime 2021年05月17日 14:51:00
*/
public interface ToyProduct {
/**
* 抽象方法 : 商品生产方法
*/
void createProduct();
}
步骤二 : 创建抽象工厂
* @Description 抽象工厂 : 包含具体工厂生产方法
* @createTime 2021年05月17日 14:47:00
*/
public interface InterfaceFactory {
/**
* 获取纪念产品
* @return 纪念产品
*/
ToyProduct getCommemorateProduct();
/**
* 获取普通产品
* @return 普通产品
*/
ToyProduct getGeneralProduct();
}
步骤三 : 创建抽象产品
* @Description 具体产品方法 :
* @createTime 2021年05月17日 14:55:00
*/
public class AnimalProduct implements ToyProduct {
@Override
public void createProduct() {
System.out.println("动物玩偶开始生产 : ");
}
}
* @Description 抽象产品 : 人物玩偶
* @createTime 2021年05月17日 14:57:00
*/
public class FiguresProduct implements ToyProduct {
@Override
public void createProduct() {
System.out.println("人物玩偶开始生产 : ");
}
}
步骤四 : 创建具体产品
public class CatProduct extends AnimalProduct {
@Override
public void createProduct() {
System.out.println("生产了普通款大橘猫玩偶");
}
}
public class DogProduct extends AnimalProduct {
@Override
public void createProduct() {
System.out.println("生产了一直纪念款柴犬玩偶");
}
}
public class IronManProduct extends FiguresProduct {
@Override
public void createProduct() {
System.out.println("生产了纪念款钢铁侠");
}
}
public class WukongProduct extends FiguresProduct {
@Override
public void createProduct() {
System.out.println("生产了普通款玩偶悟空大师");
}
}
步骤五 : 创建具体工厂
* @Description 国内玩偶工厂
* @createTime 2021年05月17日 14:48:00
*/
public class AnimalFactory implements InterfaceFactory {
@Override
public ToyProduct getCommemorateProduct() {
return new DogProduct();
}
@Override
public ToyProduct getGeneralProduct() {
return new CatProduct();
}
}
* @Description 具体工厂 : 国外玩偶工厂
* @createTime 2021年05月17日 14:49:00
*/
public class FiguresFactory implements InterfaceFactory {
@Override
public ToyProduct getCommemorateProduct() {
return new IronManProduct();
}
@Override
public ToyProduct getGeneralProduct() {
return new WukongProduct();
}
}
步骤五 测试
public static void main(String[] args) {
AnimalFactory animalFactory = new AnimalFactory();
animalFactory.getCommemorateProduct().createProduct();
animalFactory.getGeneralProduct().createProduct();
FiguresFactory figuresFactory = new FiguresFactory();
figuresFactory.getCommemorateProduct().createProduct();
figuresFactory.getGeneralProduct().createProduct();
}
五 总结 :
应用场景 :
-
一个系统不应当依赖于具体类实例如何被创建、 组合和表达的细节, 这对于所有类型的工厂模式都是很重要的, 用户无须关心对象的创建过程, 将对象的创建和使用解耦。
-
这个系统有多个系列产品,而系统中只消费其中某一系列产品。 可以通过配置文件等方式来使得用户可以动态改变族, 也可以很方便地增加新的族。
-
系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现
对抽象工厂模式的学习就记录这么多,如果对大家有帮助的话,可以点一个赞哈,你的鼓励也是创作的动力.共同在计算机的世界加油吧 !