不好意思,昨天没有来得及学习,今天补上抽象工厂模式。
抽象工厂方法,是一种比较常用的模式。
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。)
抽象工厂模式的通用类图:
下面来看一下抽象工厂模式的通用代码:
抽象产品类:
public abstract class AbstractProductA{
//通用方法
public void shareMethod(){
...
}
//相同方法,不同处理实现
public abstract void doSomething();
}
具体产品类A1:
public class ProductA1 extends AbstractProductA{
//相同方法,不同处理实现
public void doSomething(){
System.out.println("产品A1...");
}
}
具体产品类A2:
public class ProductA2 extends AbstractProductA{
//相同方法,不同处理实现
public abstract void doSomething(){
System.out.println("产品A2...");
}
}
可以像A类产品一样实现多个这样子的产品类,这里我们假设再实现了一个同样的B类产品类。我们再来看一下抽象工厂类的代码:
public abstract class AbstractFactory{
//生产A类产品,具体生产A1类产品还是A2类产品,在具体的工厂实现类中实现...
public abstract AbstractProductA createProductA();
//生产B类产品
public abstract AbstractProductB createProductB();
}
在抽象工厂类中根据产品类型的个数来定义产品生产线的个数。再来看一下具体的工厂实现类:
public class Factory1 extends AbstractFactory{
//生产A1类产品,具体生产A1类产品还是A2类产品,在具体的工厂实现类中实现...
public AbstractProductA createProductA(){ return new ProductA1();}
//生产B2类产品
public AbstractProductB createProductB(){ return new ProductB2();};
}
在这里可以根据需求实现具体工厂类,可以任意组合不同类型产品的不同类型实现。下面来看一下抽象工厂模式的优缺点:
优点:
1.封装性,我们不需要去关注产品的实现,只需要去关注一下工厂类,关注工厂类可以生产怎么样的产品就可以了。
2.产品类族之间的约束为非公开状态。产品A与产品B直接有什么样的约束关联,在工厂类中我们并不关注,即上层模块不用关心底层的实现和关联。
缺点:
产品族扩展非常复杂。例如需要增加一个C产品,上述的代码需要修改的工作量会很大,更加复杂的场景就会带来更加巨大的工作量。
抽象工厂模式的试用场景: