- 概述
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
UML
![](https://img.haomeiwen.com/i9819800/540e969627de28e0.png)
- code
public interface Creator {
/**
* 创建产品A
* @return ProductA
*/
ProductA createProductA();
/**
* 创建产品B
* @return ProductB
*/
ProductB createProductB();
}
public class ConcreteCreator1 implements Creator {
@Override
public ProductA createProductA() {
return new ProductA1();
}
@Override
public ProductB createProductB() {
return new ProductB1();
}
}
public class ConcreteCreator2 implements Creator {
@Override
public ProductA createProductA() {
return new ProductA2();
}
@Override
public ProductB createProductB() {
return new ProductB2();
}
}
public interface ProductA {
void methodA();
}
public class ProductA1 implements ProductA{
@Override
public void methodA() {
System.out.println("A产品1型号");
}
}
public class ProductA2 implements ProductA{
@Override
public void methodA() {
System.out.println(" A产品2型号");
}
}
public interface ProductB {
void methodB();
}
public class ProductB1 implements ProductB{
@Override
public void methodB() {
System.out.println("B产品1型号");
}
}
public class ProductB2 implements ProductB{
@Override
public void methodB() {
System.out.println("B产品2型号");
}
}
- 测试类
public class Main{
public static void main(String[] args) {
// Creator creator = new ConcreteCreator2();
Creator creator = new ConcreteCreator1();
ProductA productA = creator.createProductA();
ProductB productB = creator.createProductB();
productA.methodA();
productB.methodB();
/**
* creator = new ConcreteCreator2();
* productA = creator.createProductA();
* productB = creator.createProductB();
* productA.methodA();
* productB.methodB();
*/
}
}
上面代码满足了解耦合与开闭原则,但是也带来了新的问题
-
优点
- 由于具体工厂类,在一个应用中只需要在初始化时出现一次,这使得改变一个应用的具体工厂变得非常容易,只需要改变具体工厂即可
- 创建实例的过程与客户端分离,客户端是通过它们的抽象接口操作实例,产品的具体类名被具体工厂的实现分离,不会出现在客户代码中
-
缺点
代码冗余,新增一个产品类要增加三个类,ConcreteCreator2 ,ProductB ,ProductB2 ;
网友评论