设计模式之禅

《设计模式之禅》读书笔记-2.3-抽象工厂模式

2016-03-01  本文已影响38人  yeing

2.3 抽象工厂模式

定义:

Provide an interface for creating famillies of related or dependent objects without specifying their concreate classes.
为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。

优点:

  1. 封装性,每个产品的实现类不是高层模块要关心的
  2. 产品族内的约束为非公开状态。ex:生产左右车门的比例

缺点:

  1. 产品族扩展非常困难。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();
    }
}
上一篇下一篇

猜你喜欢

热点阅读