美文网首页设计模式之禅
《设计模式之禅》读书笔记-2.3-抽象工厂模式

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

作者: yeing | 来源:发表于2016-03-01 12:45 被阅读38次

    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();
        }
    }

    相关文章

      网友评论

        本文标题:《设计模式之禅》读书笔记-2.3-抽象工厂模式

        本文链接:https://www.haomeiwen.com/subject/vzogkttx.html