zoukankan      html  css  js  c++  java
  • 设计模式复习--抽象工厂模式

    抽象工厂模式提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。

    抽象工厂允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是什么。这样一来,客户就可以从具体的产品中被解耦。

    FACTORY?追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory   工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

     
    //定义不同的产品之间的一定具备的标准,用interface实现
    //其中的method()方法可看作提取出不同产品的共性,如手机都有类似的功能
    interface IProductA {
        public void method();
    }
     
    interface IProductB {
        public void method();
    }
     
    // 实现了产品标准实现的一系列具体产品
    // 由于已经设计好A1由厂商1生产,故以下输出代码有“厂商x”
    class ProductA1 implements IProductA {
        public void method() {
            System.out.println("厂商1    生产ProductA1 ...");
        }
    }
     
    class ProductA2 implements IProductA {
        public void method() {
            System.out.println("厂商2    生产ProductA2 ...");
        }
    }
     
    class ProductB1 implements IProductB {
        public void method() {
            System.out.println("厂商1    生产ProductB1 ...");
        }
    }
     
    class ProductB2 implements IProductB {
        public void method() {
            System.out.println("厂商2    生产ProductB2 ...");
        }
    }
     
    // 每一种牌子的产品生产工厂,即不同的厂商负责自己牌子产品的生产
    abstract class Factory1 {
        abstract IProductA getProductA1();
     
        abstract IProductB getProductB1();
    }
     
    abstract class Factory2 {
        abstract IProductA getProductA2();
     
        abstract IProductB getProductB2();
    }
     
    // 具体的工厂用来生产相关的产品
    class ConcreteFactory1 extends Factory1 {
        public IProductA getProductA1() {
            return new ProductA1();
        }
     
        public IProductB getProductB1() {
            return new ProductB1();
        }
    }
     
    class ConcreteFactoryB extends Factory2 {
        public IProductA getProductA2() {
            return new ProductA2();
        }
     
        public IProductB getProductB2() {
            return new ProductB2();
        }
    }
     
    // 测试类
    public class AbstractFactoryModel {
        public static void main(String[] args) {
            test();
        }
        public static void test() {
            // 厂商1负责生产产品A1、B1
            Factory1 factory1 = new ConcreteFactory1();
            IProductA productA1 = factory1.getProductA1();
            IProductB productB1 = factory1.getProductB1();
     
            productA1.method();
            productB1.method();
     
            // 厂商2负责生产产品A2、B2
            Factory2 factory2 = new ConcreteFactoryB();
            IProductA productA2 = factory2.getProductA2();
            IProductB productB2 = factory2.getProductB2();
     
            productA2.method();
            productB2.method();
        }
    }

     2015年12月8日21:38:02更新

    抽象工厂的缺点:由于划分的比较细致,导致过多抽象类和接口的出现,导致类文件超多,所以实际开发中谨慎考虑 。

    抽象工厂的优点:实现解耦,能够在不同的产品类之间灵活切换。

  • 相关阅读:
    安卓模拟器genimotion安装过程
    python3安装过程
    python基础数据类型数字和字符串
    genimotion模拟器和appium环境配置
    ArcEngine中的ICommand和ITool
    BM.AE介绍
    地图数据和版式数据联动
    BM.AE中的命令工具体系
    2021年1月1日 AutoCAD.Net/C#.Net QQ群:193522571获取任意路径dwg文件内所有块在控件中显示并能选择插入当前模型空间
    2021年1月1日 AutoCAD.Net/C#.Net QQ群:193522571用acedGrRead()函数实现一拖多
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/3679320.html
Copyright © 2011-2022 走看看