目录
0、定义
提供一个创建一系列或相互依赖对象的接口,而无须指定它们具体的类。
1、抽象工厂模式的四种角色
- 抽象产品(Product):一个抽象类或接口,负责定义具体产品必须实现的方法。
- 具体产品(ConcreteProduct):具体产品 是个类,继承或实现抽象产品接口的类。
- 抽象工厂(AbstractFactory):一个抽象类或接口,负责定义若干个抽象方法。
- 具体工厂(ConcreteFactory):具体工厂 重写或实现抽象工厂 中的抽象方法,使该方法返回具体产品的实例。
2、抽象工厂的UML类图
3、示例代码
抽象产品A
java
package xyz.jangle.design.abstractfactory;
public interface ProductA {
}
具体产品A1和A2
java
package xyz.jangle.design.abstractfactory;
public class ProductA1 implements ProductA {
}
java
package xyz.jangle.design.abstractfactory;
public class ProductA2 implements ProductA {
}
抽象产品B
java
package xyz.jangle.design.abstractfactory;
public interface ProductB {
}
具体产品B1和B2
java
package xyz.jangle.design.abstractfactory;
public class ProductB1 implements ProductB {
}
java
package xyz.jangle.design.abstractfactory;
public class ProductB2 implements ProductB {
}
抽象工厂
java
package xyz.jangle.design.abstractfactory;
public abstract class AbstractFactory {
public abstract ProductA createProductA();
public abstract ProductB createProductB();
}
具体工厂1和具体工厂2
java
package xyz.jangle.design.abstractfactory;
public class ConcreteFactory1 extends AbstractFactory {
@Override
public ProductA createProductA() {
return new ProductA1();
}
@Override
public ProductB createProductB() {
return new ProductB1();
}
}
java
package xyz.jangle.design.abstractfactory;
public class ConcreteFactory2 extends AbstractFactory {
@Override
public ProductA createProductA() {
return new ProductA2();
}
@Override
public ProductB createProductB() {
return new ProductB2();
}
}
客户端(使用)
java
package xyz.jangle.design.abstractfactory;
public class AppMain14 {
public static void main(String[] args) {
AbstractFactory factory1 = new ConcreteFactory1();
ProductA productA = factory1.createProductA();
ProductB productB = factory1.createProductB();
System.out.println("抽象工厂1生产了 A1和B1的产品:"+ productA+" and "+productB);
AbstractFactory factory2 = new ConcreteFactory2();
ProductA productA2 = factory2.createProductA();
ProductB productB2 = factory2.createProductB();
System.out.println("抽象工厂2生产了 A2和B2的产品:"+ productA2+" and "+productB2);
}
}
输出信息
bash
抽象工厂1生产了 A1和B1的产品:xyz.jangle.design.abstractfactory.ProductA1@659e0bfd and xyz.jangle.design.abstractfactory.ProductB1@2a139a55
抽象工厂2生产了 A2和B2的产品:xyz.jangle.design.abstractfactory.ProductA2@15db9742 and xyz.jangle.design.abstractfactory.ProductB2@6d06d69c