三、工厂模式
1、模式结构及结构图
1.1 抽象工厂(abstract factory):提供创建产品的接口,调用者通过接口来访问具体工厂的方法,从而达到创建产品的效果。
1.2 具体工厂(concrete factory):实现抽象工厂,重写创建具体产品的方法。
1.3 抽象产品(abstract product):抽象产品接口,定义产品规范和特性。
1.4 具体产品(concrete product):实现了抽象产品接口,为抽象产品的具体实现。
结构图:
2、代码实战
需求描述:有两个工厂A和B分别生产A,B两种产品。
2.1 抽象工厂:
package factory.factory;
import factory.ProductTypeConst;
/**
* 简单工厂
*
* @author 刀刀和阳
*/
public interface Factory {
/**
* 抽象接口,返回实例
*
* @return Product
*/
Product newInstance();
}
2.2 具体工厂实现:
– 工厂A
package factory.factory;
/**
* 具体的A工厂
*
* @author 刀刀和阳
*/
public class ConcreteFactoryA implements Factory{
@Override
public Product newInstance() {
System.out.println("开始生产产品A");
return new ProductA();
}
}
– 工厂B
package factory.factory;
/**
* 具体的B工厂
*
* @author 刀刀和阳
*/
public class ConcreteFactoryB implements Factory{
@Override
public Product newInstance() {
System.out.println("开始生产产品B");
return new ProductB();
}
}
2.3 抽象产品类:
package factory.factory;
/**
* 产品接口
*
* @author 刀刀和阳
*/
public interface Product {
/**
* 显示产品信息
*/
void show();
}
2.4 具体产品:
– 产品A
package factory.factory;
/**
* 产品A
* @author 刀刀和阳
*/
public class ProductA implements Product {
@Override
public void show() {
System.out.println("this is product A");
}
}
– 产品B
package factory.factory;
/**
* 产品B
* @author 刀刀和阳
*/
public class ProductB implements Product {
@Override
public void show() {
System.out.println("this is product B");
}
}
2.5 测试:
package factory.factory;
/**
* 测试方法
*
* @author 刀刀和阳
*/
public class Main {
public static void main(String[] args) {
System.out.println("开始生产第一件产品");
Factory concreteFactoryA = new ConcreteFactoryA();
Product product = concreteFactoryA.newInstance();
product.show();
System.out.println("开始生产第二件产品");
Factory concreteFactoryB = new ConcreteFactoryB();
Product product1 = concreteFactoryB.newInstance();
product1.show();
}
}
输出结果:
3、总结
优点:
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
- 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
- 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
缺点:
- 类的个数容易过多,增加复杂度
- 增加了系统的抽象性和理解难度
- 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。
应用场景:
- 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
- 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
- 客户不关心创建产品的细节,只关心产品的品牌
应用场景:
- 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
- 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
- 客户不关心创建产品的细节,只关心产品的品牌
4、进阶
抽象工厂模式:在工厂模式的基础上,可以创建多种产品。即产品的接口可以是多个。