zoukankan      html  css  js  c++  java
  • 三、抽象工厂模式

    设计模式

    三、抽象工厂模式

    主要解决:简单工厂升级版,适合产品有多于一个的产品族,而系统只消费其中某一族的产品。

    优点:

    1. 多个产品一起工作,可以使用同一产品对象

    2. 易于对产品横向升级

    缺点:产品族难扩展,需要修改抽象工厂及其实现

    UML类图

    ../_images/FactoryMethod.jpg

    实现:

    *注:抽象产品工厂模式不利于产品的纵向增加,例如增加productC,需要修改工厂抽象类以及其实现;方便产品的横向升级,例如增加 3类 AB产品,只需要增加3类产品类,实现抽象工厂接口即可

    // 工厂抽象类 用于创建产品组里所有产品  *不易于扩展其他产品
    public interface AbstractFactory {
       Product createProductA();
       Product createProductB();
    }
    // 产品抽象类 约定产品公用属性以及方法
    public interface Product {
        void doSomething();
    }
    /**
     * 产品创造工厂
     * 此处实验约定 产品工厂1 生产类型1的 A、B 产品
     *  产品工厂2 生产类型2的 A、B 产品
     */
    // 产品工厂1
    public class Product1Factory implements AbstractFactory {
        @Override
        public Product createProductA() {
            return new ProductA_1();
        }
        @Override
        public Product createProductB() {
            return new ProductB_1();
        }
    }
    // 产品工厂2
    public class Product2Factory implements AbstractFactory {
        @Override
        public Product createProductA() {
            return new ProductA_2();
        }
        @Override
        public Product createProductB() {
            return new ProductB_2();
        }
    }
    // A产品抽象类类 这里也可直接实现产品接口,实现具体产品
    public abstract class ProductA implements Product {
        public abstract void doSomething();
    }
    ​
    // 1类 A产品
    public class ProductA_1 extends ProductA {
        @Override
        public void doSomething() {
            System.out.println("ProductA_1");
        }
    }
    ​
    // 2类 A产品
    public class ProductA_2 extends ProductA {
        @Override
        public void doSomething() {
            System.out.println("ProductA_2");
        }
    }
    // B产品抽象类类
    public abstract class ProductB implements Product {
        public abstract void doSomething();
    }
    ​
    // 1类 B产品
    public class ProductB_1 extends ProductB {
        @Override
        public void doSomething() {
            System.out.println("ProductB_1");
        }
    }
    ​
    // 2类 B产品
    public class ProductB_2 extends ProductB {
        @Override
        public void doSomething() {
            System.out.println("ProductB_2");
        }
    }

     

  • 相关阅读:
    Retrofit/Okhttp API接口加固技术实践(上)
    浅析C#中的结构体和类
    iOS中 支付宝钱包具体解释/第三方支付 韩俊强的博客
    Java并发之volatile二
    dynamic initializer和全局变量
    二叉树转换成森林&森林变成二叉树
    这才是真正的裸眼3D!超级震撼!!
    每一个开发人员都应该有一款自己的App
    Hibernate HQL的使用
    我的Android进阶之旅------>Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
  • 原文地址:https://www.cnblogs.com/Ddsl/p/13176640.html
Copyright © 2011-2022 走看看