美文网首页设计模式整理
抽象工厂模式(AbstractFactory)

抽象工厂模式(AbstractFactory)

作者: MrWangLei6666 | 来源:发表于2017-10-27 11:37 被阅读0次

    举例说明:

    /**
     * 作者:wanglei
     * 邮箱:229846388@qq.com
     * 抽象工厂模式
     * 工厂类
     */
    abstract class Factory {
        /**
         * @return 制造容器
         */
        public abstract Product ManufactureContainer();
    
        /**
         * @return 制造模具
         */
        public abstract Product ManufactureMould();
    }
    
    /**
     * A厂 - 生产模具+容器产品
     */
    class FactoryA extends Factory{
    
        @Override
        public Product ManufactureContainer() {
            return new ContainerProductA();
        }
    
        @Override
        public Product ManufactureMould() {
            return new MouldProductA();
        }
    }
    
    /**
     *B厂 - 生产模具+容器产品
     */
    class FactoryB extends Factory{
    
        @Override
        public Product ManufactureContainer() {
            return new ContainerProductB();
        }
    
        @Override
        public Product ManufactureMould() {
            return new MouldProductB();
        }
    }
    
    /**
     * 作者:wanglei 
     * 邮箱:229846388@qq.com
     * 抽象工厂模式
     * 抽象产品族类
     */
    abstract class Product {
        public abstract void show();
    }
    
    /**
     * 容器产品抽象类
     */
    abstract class ContainerProduct extends Product {
        @Override
        public void show() {
    
        }
    }
    
    /**
     * 模具产品抽象类
     */
    abstract class MouldProduct extends Product{
        @Override
        public void show() {
    
        }
    }
    
    /**
     * 容器产品A类
     */
    class ContainerProductA extends ContainerProduct{
        @Override
        public void show() {
            System.out.println("生产出了容器产品A");
        }
    }
    
    /**
     * 容器产品B类
     */
    class ContainerProductB extends ContainerProduct{
        @Override
        public void show() {
            System.out.println("生产出了容器产品B");
        }
    }
    
    /**
     * 模具产品A类
     */
    class MouldProductA extends MouldProduct{
        @Override
        public void show() {
            System.out.println("生产出了模具产品A");
        }
    }
    
    /**
     * 模具产品B类
     */
    class MouldProductB extends MouldProduct{
        @Override
        public void show() {
            System.out.println("生产出了模具产品B");
        }
    }
    
    /**
     * 作者:wanglei 
     * 邮箱:229846388@qq.com
     * 抽象工厂模式
     * 定义:
     * 1.抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。
     * 2.抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类
     * 主要作用:
     * 1.允许使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么,这样就可以从具体产品中被解耦。
     * 解决的问题:
     * 每个工厂只能创建一类产品,即工厂方法模式的缺点
     * 实例概况:
     * 背景:小成有两间塑料加工厂(A厂仅生产容器类产品;B厂仅生产模具类产品);随着客户需求的变化,A厂所在地的客户需要也模具类产品,B厂所在地的客户也需要容器类产品;
     * 冲突:没有资源(资金+租位)在当地分别开设多一家注塑分厂
     * 解决方案:在原有的两家塑料厂里增设生产需求的功能,即A厂能生产容器+模具产品;B厂间能生产模具+容器产品。
     */
    public class SimpleFactoryPattern {
    
        public static void main(String[] args) {
            FactoryA factoryA = new FactoryA();
            FactoryB factoryB = new FactoryB();
            //A厂当地客户需要容器产品A
            factoryA.ManufactureContainer().show();
            //A厂当地客户需要模具产品A
            factoryA.ManufactureMould().show();
            //B厂当地客户需要容器产品B
            factoryB.ManufactureContainer().show();
            //B厂当地客户需要模具产品B
            factoryB.ManufactureMould().show();
        }
    }
    
    
    /**
     * 结果:
     * 生产出了容器产品A
     * 生产出了模具产品A
     * 生产出了容器产品B
     * 生产出了模具产品B
     * 优点:
     * 1.降低耦合:
     * 抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展;
     * 2.更符合开-闭原则:
     * 新增一种产品类时,只需要增加相应的具体产品类和相应的工厂子类即可::简单工厂模式需要修改工厂类的判断逻辑
     * 3.符合单一职责原则:
     * 每个具体工厂类只负责创建对应的产品::简单工厂中的工厂类存在复杂的switch逻辑判断
     * 4.不使用静态工厂方法,可以形成基于继承的等级结构。::简单工厂模式的工厂类使用静态工厂方法
     * 缺点:
     * 1.抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。
     * 2.对于新的产品族符合开-闭原则;对于新的产品种类不符合开-闭原则,这一特性称为开-闭原则的倾斜性。
     * 应用场景:
     * 1.一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。
     * 2.这个系统有多个系列产品,而系统中只消费其中某一系列产品
     * 3.系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。
     */
    

    相关文章

      网友评论

        本文标题:抽象工厂模式(AbstractFactory)

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