设计模式之工厂模式
现在是对工厂模式的学习,之前的部分有对简单工厂的学习,如果对简单工厂模式不太了解的话可以回过去熟悉一下,下面进入正文的学习
一 : 含义 什么是工厂模式 ?
工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。
二 : 解决的问题
工厂一旦需要生产新产品就需要修改工厂类的方法逻辑,违背了“开放 - 关闭原则 (简单工厂模式的缺点)
三: 模式原理
3.1模式的结构
工厂方法模式的主要角色如下。
- 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
- 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
3.2模式类图
3.3 优缺点
优点:
- 更符合开-闭原则新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可
- 符合单一职责原则,灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
- 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
总结:工厂模式可以说是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优点的同时,让扩展变得简单,让继承变得可行,增加了多态性的体现。
缺点:
- 类的个数容易过多,
- 增加复杂度 增加了系统的抽象性和理解难度
- 抽象产品只能生产一种产品此弊端可使用抽象工厂模式解决。
四 实现代码
步骤一 : 创建抽象产品
* @Description 抽象产品 : 玩具
* @createTime 2021年05月14日 15:30:00
*/
public interface Toy {
/**
* 抽象方法 : 获取玩具
*/
void getProduct();
}
步骤二 : 创建抽象工厂
* @Description 抽象工厂 : 提供了创建产品的接口
* @createTime 2021年05月14日 15:32:00
*/
public interface ProductFactory {
/**
* 调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
* @return 具体产品
*/
Toy makeProduct();
}
步骤三 : 创建具体产品
* @Description 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,
* 由具体工厂来创建,它同具体工厂之间一一对应。
* @createTime 2021年05月14日 15:34:00
*/
public class ToyList {
static class ToyDog implements Toy{
@Override
public void getProduct() {
System.out.println("一个玩具狗");
}
}
static class ToyCat implements Toy{
@Override
public void getProduct() {
System.out.println("一个玩具喵");
}
}
}
步骤四 : 创建具体工厂
* @Description 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
* @createTime 2021年05月14日 15:37:00
*/
public class FactoryList {
static class DogToyFactory implements ProductFactory{
@Override
public Toy makeProduct() {
return new ToyList.ToyDog();
}
}
static class CatToyFactory implements ProductFactory{
@Override
public Toy makeProduct() {
return new ToyList.ToyCat();
}
}
}
步骤五 测试
public static void main(String[] args) {
//客户想要一个玩具猫
FactoryList.DogToyFactory dogToyFactory = new FactoryList.DogToyFactory();
dogToyFactory.makeProduct().getProduct();
//客户想要一个玩具狗
FactoryList.CatToyFactory catToyFactory = new FactoryList.CatToyFactory();
catToyFactory.makeProduct().getProduct();
}
五 总结 :
应用场景 :
- 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
- 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
- 客户不关心创建产品的细节,只关心产品的品牌
对工厂模式的学习就记录这么多,如果对大家有帮助的话,可以点一个赞哈,你的鼓励也是创作的动力.共同在计算机的世界加油吧 !