• Java设计模式:Abstract Factory(抽象工厂)模式


    概念定义

    抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

    抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品),而系统只消费其中某一族的产品。换句话说,抽象工厂创建一整套具有相互依赖或作用关系的产品(至少两个产品),而工厂方法中的工厂只能创建单一系列的产品。

    应用场景

    • 客户端不需要知道它所创建的对象的类。
    • 需要一组对象共同完成某种功能时,并且可能存在多组对象完成不同功能的情况。
    • 系统结构稳定,不会频繁地增加对象。

    示例代码

    抽象工厂模式由工厂接口(或抽象类)、一组实现工厂接口工厂类、一个产品接口(或抽象类)和一组实现产品接口的具体产品组成。

    本节通过一个"喜闻乐见"的豪车系列,展示抽象工厂模式的实现。示例代码如下(注意豪车有两个产品 -- 引擎和娱乐系统):

    // 产品接口 - 引擎 //
    public interface IEngine {
        void show();
    }
    // 若干具体的产品 - 宝马与奔驰的引擎 //
    public class BmwEngine implements IEngine {
        @Override
        public void show() { System.out.println("Bmw's engine"); }
    }
    public class BenzEngine implements IEngine {
        @Override
        public void show() { System.out.println("Benz's engine"); }
    }
    
    // 产品接口 - 娱乐系统 //
    public interface IEntertainment {
        void show();
    }
    // 若干具体的产品 - 宝马与奔驰的娱乐系统 //
    public class BmwEntertainment implements IEntertainment {
        @Override
        public void show() { System.out.println("Bmw's entertainment"); }
    }
    public class BenzEntertainment implements IEntertainment {
        @Override
        public void show() { System.out.println("Benz's entertainment"); }
    }
    
    // 抽象工厂接口 //
    public interface IFactory {
        public IEngine createEngine(); // 不必为引擎和娱乐系统分别增加两个工厂接口!
        public IEntertainment createEntertainment();
    }
    // 若干具体的工厂 - 为车创建引擎和娱乐系统 //
    public class BmwFactory implements IFactory { // 结合了工厂方法模式
        @Override
        public IEngine createEngine() { return new BmwEngine(); }
        @Override
        public IEntertainment createEntertainment() { return new BmwEntertainment(); }
    }
    public class BenzFactory implements IFactory {
        @Override
        public IEngine createEngine() { return new BenzEngine(); }
        @Override
        public IEntertainment createEntertainment() { return new BenzEntertainment(); }
    }
    

    客户端通过如下方式调用:

    IFactory bmwFactory = new BmwFactory();
    bmwFactory.createEngine().show();
    bmwFactory.createEntertainment().show();
    IFactory benzFactory = new BenzFactory();
    benzFactory.createEngine().show();
    benzFactory.createEntertainment().show();
    

    模式优缺点

    抽象工厂模式的优点如下:

    • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

    缺点如下:

    • 产品族扩展非常困难。增加一个系列的某一产品时,需要同时修改抽象工厂和具体工厂。

    业界实践

  • 相关阅读:
    版本控制器 git
    JS 严格模式
    backquote
    linux内存监控 free
    好的linux网站
    linux查看进程开始时间
    命令之 ulimit
    using JSTL
    javax.servlet.jsp.PageContext cannot be resolved to a type
    jstl c
  • 原文地址:https://www.cnblogs.com/clover-toeic/p/11613804.html
Copyright © 2020-2023  润新知