zoukankan      html  css  js  c++  java
  • 【java设计模式】-03抽象工厂模式

    抽象工厂 简述

    抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

    抽象工厂模式结构

    抽象工厂模式包含如下角色:

    AbstractFactory:抽象工厂

    ConcreteFactory:具体工厂

    AbstractProduct:抽象产品

    Product:具体产品

    image

    代码实例

    /**
     * 抽象工厂
     *
     * @author kaifeng
     * @date 2018/8/19
     */
    public abstract class AbstractCarFactory {
        /**
         * 获取相应的car对象
         *
         * @param carType car类型
         * @return ICar
         */
        public abstract ICar getCar(CarType carType);
    }
    
    /**
     * 具体实现工厂
     *
     * @author kaifeng
     * @date 2018/8/19
     */
    public class CarConcreteFactory extends AbstractCarFactory {
        /**
         * 获取相应的car对象
         *
         * @param carType car类型
         * @return ICar
         */
        @Override
        public ICar getCar(CarType carType) {
            if (carType == CarType.CAR) {
                return new Car();
            }
            if (carType == CarType.BUS) {
                return new Bus();
            }
            if (carType == CarType.SUV) {
                return new Suv();
            }
            return null;
        }
    }
    
    
    /**
     * 生成工厂对象
     *
     * @author kaifeng
     * @date 2018/8/19
     */
    public class AbstractFactoryProducer {
        public static AbstractCarFactory getFactory(String factoryType) {
            if ("car".equalsIgnoreCase(factoryType)) {
                return new CarConcreteFactory();
            }
            return null;
        }
    }
    
    /**
     * 抽象工厂demo
     *
     * @author kaifeng
     * @date 2018/8/19
     */
    public class AbatractFactoryDemo {
        public static void main(String[] args) {
            //获取产品工厂
            AbstractCarFactory abstractCarFactory = AbstractFactoryProducer.getFactory("car");
    
            //获取产品为car的对象
            ICar car = abstractCarFactory.getCar(CarType.CAR);
            System.out.println(car.getCarName());
    
            //获取产品为bus的对象
            ICar bus = abstractCarFactory.getCar(CarType.BUS);
            System.out.println(bus.getCarName());
    
            //获取产品为SUV的对象
            ICar suv = abstractCarFactory.getCar(CarType.SUV);
            System.out.println(suv.getCarName());
        }
    }
    

    优点

    抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。

    当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。

    增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

    缺点

    在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。

    适用场景

    一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。

    系统中有多于一个的产品族,而每次只使用其中某一产品族。

    属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
    系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

  • 相关阅读:
    港湾交换机-交换机配置
    华为交换机-SNMP配置
    H3C交换机-SNMP配置
    CISCO交换机-SNMP配置
    docker容器与宿主交互数据
    MYSQL总览
    mysql数据类型优化
    compact 创建一个包含变量名为数组的键和它们的值为数组的值的数组
    php单例模式
    完形填空格式
  • 原文地址:https://www.cnblogs.com/liukaifeng/p/10052604.html
Copyright © 2011-2022 走看看