抽象工厂设计模式
2019, Sep 16
抽象工厂设计模式
抽象工厂模式:是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在有多个业务品种、业务分类时(也就是同一个产品,存在不同的等级情况下),通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
对比:工厂设计模式
抽象产品类
与工厂方法的不同是:
根据产品类别可以有多个抽象产品类(又叫产品族)
// 抽象产品类A
public abstract class AbstractProductA {
//每个产品共有的方法
public void shareMethod(){
}
//每个产品相同方法,不同实现
public abstract void doSomething();
}
// 抽象产品类B
public abstract class AbstractProductA {
//每个产品共有的方法
public void shareMethod(){
}
//每个产品相同方法,不同实现
public abstract void doSomething();
}
抽象工厂类
与工厂方法的不同是:
有N个产品族,在抽象工厂类中就应该有N个创建方法。
而
工厂模式的抽象工厂是从,方法维度来进行抽象的,工厂模式的抽象工厂如下
public abstract class Creator { public Product fixedMethod(Class<T> c) { Product product; product = createProduct(c); // 后面是固定的处理逻辑 } public abstract <T extends Product> T createProduct(Class<T> c); }
public abstract class AbstractCreator {
//创建A产品家族
public abstract AbstractProductA createProductA();
//创建B产品家族
public abstract AbstractProductB createProductB();
}
具体产品类
// 产品类A1
public class ProductA1 extends AbstractProductA {
public void doSomething() {
System.out.println("产品A1的实现方法");
}
}
// 产品类A2
public class ProductA2 extends AbstractProductA {
public void doSomething() {
System.out.println("产品A2的实现方法");
}
}
// 产品类B1
public class ProductA1 extends AbstractProductA {
public void doSomething() {
System.out.println("产品B1的实现方法");
}
}
// 产品类B2
public class ProductA2 extends AbstractProductA {
public void doSomething() {
System.out.println("产品B2的实现方法");
}
}
具体工厂类
有M个产品等级就应该有M个实现工厂类,在每个实现工厂中,实现不同产品族 的生产任务。
// 根据产品等级创建的工厂
public class Creator1 extends AbstractCreator {
//只生产产品等级为1的A产品
public AbstractProductA createProductA() {
return new ProductA1();
}
//只生产产品等级为1的B产品
public AbstractProductB createProductB() {
return new ProductB1();
}
}
// 产品类B1
public class ProductA1 extends AbstractProductA {
public void doSomething() {
System.out.println("产品B1的实现方法");
}
}
// 产品类B2
public class ProductA2 extends AbstractProductA {
public void doSomething() {
System.out.println("产品B2的实现方法");
}
}
测试
与工厂方法不同:
现在的工厂是抽象的,具体的工厂会有很多个
public class Client {
public static void main(String[] args) {
//定义出两个工厂
AbstractCreator creator1 = new Creator1();
AbstractCreator creator2 = new Creator2();
//产生A1对象
AbstractProductA a1 = creator1.createProductA();
//产生A2对象
AbstractProductA a2 = creator2.createProductA();
//产生B1对象
AbstractProductB b1 = creator1.createProductB();
//产生B2对象
AbstractProductB b2 = creator2.createProductB();
}
}
抽象工厂类图