2.3 抽象工厂模式
定义:
Provide an interface for creating famillies of related or dependent objects without specifying their concreate classes.
为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。
优点:
- 封装性,每个产品的实现类不是高层模块要关心的
- 产品族内的约束为非公开状态。ex:生产左右车门的比例
缺点:
- 产品族扩展非常困难。ex:增加产品C,抽象工厂AbstractCreator 要增加 createProductC(),具体工厂Creator1和Creator2 都需要修改。
ex:违反了开闭原则。抽象类和接口是一个契约,改变契约,所有与契约有关的代码都要改。
使用场景:
一个对象(或者是一组没有任何关系的对象)都有相同的约束,则可以使用工厂模式。
ex:文本编辑器和图片查看器,在linux和windows上功能相同,代码实现不同。
两者的共同约束:操作系统类型。
可以采用抽象工厂模式产生不同操作系统下的软件。
注意:
产品等级的扩展容易:增加一个产品等级,只要增加一个工厂负责新任务即可,符合开闭原则。
总结:
产品层级-产品等级:纵向,车型号,人肤色。难扩展
产品种类-产品族:横向,车门,人性别。易扩展
代码:
/**
* *************************抽象产品类***********************
*/
abstract class AbstractProductA{
//每个产品的共有方法
public void shareMethod(){}
//每个产品相同方法,不同实现
public abstract void doSomething();
}
abstract class AbstractProductB{
public void shareMethod(){}
public abstract void doSomething();
}
/**
* *************************具体产品类***********************
*/
class ProductA1 extends AbstractProductA{
public void doSomething(){System.out.println("产品A1的实现方法");}
}
class ProductA2 extends AbstractProductA{
public void doSomething(){System.out.println("产品A2的实现方法");}
}
class ProductB1 extends AbstractProductB{
public void doSomething(){System.out.println("产品B1的实现方法");}
}
class ProductB2 extends AbstractProductB{
public void doSomething(){System.out.println("产品B2的实现方法");}
}
/**
* *************************抽象创建者***********************
*/
abstract class AbstractCreator{
//有多少产品族(车型号),建多少个创建方法
public abstract AbstractProductA createProductA();
public abstract AbstractProductB createProuctB();
}
/**
* *************************具体创建者***********************
*
* 有多少产品等级(左右门),建多少创建者
*/
class Creator1 extends AbstractCreator{
@Override
public AbstractProductA createProductA() {
return new ProductA1();
}
@Override
public AbstractProductB createProuctB() {
return new ProductB1();
}
}
class Creator2 extends AbstractCreator{
@Override
public AbstractProductA createProductA() {
return new ProductA2();
}
@Override
public AbstractProductB createProuctB() {
return new ProductB2();
}
}
/**
* *************************场景类***********************
* 场景类中的方法与具体实现类没有关系
* 场景类只需要知道一个产品的工厂方法就可以直接生产一个产品,无需关心具体实现
*/
class Client{
public static void main(String[] args){
AbstractCreator creator1 = new Creator1();
AbstractCreator creator2 = new Creator2();
AbstractProductA a1 = creator1.createProductA();
AbstractProductB b1 = creator1.createProuctB();
AbstractProductA a2 = creator2.createProductA();
AbstractProductB b2 = creator2.createProuctB();
}
}