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

    抽象工厂模式概述

    抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。

    抽象工厂模式定义

    提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为 Kit 模式,它是一种对象创建型模式。

    抽象工厂模式结构

    1、AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。

    2、ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。

    3、AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。

    4、ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

    抽象工厂模式代码

    /**
     * Author: YiFan
     * Date: 2018/12/11 12:02
     * Description: 抽象产品-CPU
     */
    public interface CPU {
    
        void cpuName();
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 12:03
     * Description: 具体产品类
     */
    public class QualcommCPU implements CPU {
    
        @Override
        public void cpuName() {
            System.out.println("高通CPU");
        }
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 12:05
     * Description: 具体产品类
     */
    public class MediaTekCPU implements CPU {
    
        @Override
        public void cpuName() {
            System.out.println("联发科CPU");
        }
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 12:05
     * Description: 抽象产品-Screen
     */
    public interface Screen {
    
        void screenName();
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 12:06
     * Description: 具体产品类
     */
    public class LCDScreen implements Screen {
    
        @Override
        public void screenName() {
            System.out.println("LCD屏幕");
        }
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 12:06
     * Description: 具体产品类
     */
    public class OLEDScreen implements Screen {
    
        @Override
        public void screenName() {
            System.out.println("OLED屏幕");
        }
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 12:07
     * Description: 抽象工厂类-定义多个产品创建方法
     */
    public interface PhoneFactory {
    
        // 工厂方法-生产CPU
        CPU createCPU();
    
        // 工厂方法-生产Screen
        Screen createScreen();
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 12:08
     * Description: 具体工厂-创建一族产品(手机中的CPU和Screen)
     */
    public class XiaoMiFactory implements PhoneFactory {
    
        @Override
        public CPU createCPU() {
            return new QualcommCPU();
        }
    
        @Override
        public Screen createScreen() {
            return new LCDScreen();
        }
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 12:10
     * Description: 具体工厂类-创建多个产品
     */
    public class MeizuFactory implements PhoneFactory {
    
        @Override
        public CPU createCPU() {
            return new MediaTekCPU();
        }
    
        @Override
        public Screen createScreen() {
            return new OLEDScreen();
        }
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 12:11
     * Description: 客户端
     */
    public class Test {
    
        public static void main(String[] args) {
            PhoneFactory factory;
            CPU cpu;
            Screen screen;
    
            factory = new XiaoMiFactory();
            cpu = factory.createCPU();
            screen = factory.createScreen();
            cpu.cpuName();
            screen.screenName();
        }
    }
    

    直接结果为:

    高通CPU
    LCD屏幕
    

    抽象工厂模式总结

    抽象工厂模式是工厂方法模式的进一步延伸,由于它提供了功能更为强大的工厂类并且具备较好的可扩展性,在软件开发中得以广泛应用,尤其是在一些框架和 API 类库的设计中,例如在 Java 语言的 AWT(抽象窗口工具包)中就使用了抽象工厂模式,它使用抽象工厂模式来实现在不同的操作系统中应用程序呈现与所在操作系统一致的外观界面。抽象工厂模式也是在软件开发中最常用的设计模式之一。

    主要优点

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

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

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

    主要缺点

    增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。

    适用场景

    1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是很重要的,用户无须关心对象的创建过程,将对象的创建和使用解耦。

    2、系统中有多于一个的产品族,而每次只使用其中某一产品族。可以通过配置文件等方式来使得用户可以动态改变产品族,也可以很方便地增加新的产品族。

    3、 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。同一个产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束,如同一操作系统下的按钮和文本框,按钮与文本框之间没有直接关系,但它们都是属于某一操作系统的,此时具有一个共同的约束条件:操作系统的类型。

    4、产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。

    练习

    Sunny软件公司欲推出一款新的手机游戏软件,该软件能够支持 Symbian、Android 和 Windows Mobile 等多个智能手机操作系统平台,针对不同的手机操作系统,该游戏软件提供了不同的游戏操作控制 (OperationController) 类和游戏界面控制 (InterfaceController)类,并提供相应的工厂类来封装这些类的初始化过程。软件要求具有较好的扩展性以支持新的操作系统平台,为了满足上述需求,试采用抽象工厂模式对其进行设计。

    代码示例
    /**
     * Author: YiFan
     * Date: 2018/12/11 16:17
     * Description: 抽象产品-游戏操作控制
     */
    public interface OperationController {
    
        void operationController();
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 16:19
     * Description: 具体产品类
     */
    public class SymbianOperationController implements OperationController {
    
        @Override
        public void operationController() {
            System.out.println("塞班系统操作控制");
        }
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 16:20
     * Description: 具体产品类
     */
    public class AndriodOperationController implements OperationController {
    
        @Override
        public void operationController() {
            System.out.println("安卓系统操作控制");
        }
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 16:21
     * Description: 具体产品类
     */
    public class IOSOperationController implements OperationController {
    
        @Override
        public void operationController() {
            System.out.println("苹果系统操作控制");
        }
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 16:22
     * Description: 抽象产品类-界面控制
     */
    public interface InterfaceController {
    
        void interfaceController();
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 16:22
     * Description: 具体产品类
     */
    public class SymbianInterfaceController implements InterfaceController {
    
        @Override
        public void interfaceController() {
            System.out.println("塞班系统界面控制");
        }
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 16:24
     * Description: 具体产品类
     */
    public class AndriodInterfaceController implements InterfaceController {
    
        @Override
        public void interfaceController() {
            System.out.println("安卓系统界面控制");
        }
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 16:24
     * Description: 具体产品类
     */
    public class IOSInterfaceController implements InterfaceController {
    
        @Override
        public void interfaceController() {
            System.out.println("苹果系统界面控制");
        }
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 16:26
     * Description: 抽象工厂
     */
    public interface SystemFactory {
    
        // 返回具体的操作控制对象
        OperationController createOperationController();
    
        // 返回具体的界面控制对象
        InterfaceController createInterfaceController();
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 16:28
     * Description: 具体工厂
     */
    public class SybianSystemFactory implements SystemFactory {
    
        @Override
        public OperationController createOperationController() {
            return new SymbianOperationController();
        }
    
        @Override
        public InterfaceController createInterfaceController() {
            return new SymbianInterfaceController();
        }
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 16:29
     * Description: 具体工厂类
     */
    public class AndiodSystemFactory implements SystemFactory {
    
        @Override
        public OperationController createOperationController() {
            return new AndriodOperationController();
        }
    
        @Override
        public InterfaceController createInterfaceController() {
            return new AndriodInterfaceController();
        }
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 16:29
     * Description: 具体工厂类
     */
    public class IOSSystemFactory implements SystemFactory {
    
        @Override
        public OperationController createOperationController() {
            return new IOSOperationController();
        }
    
        @Override
        public InterfaceController createInterfaceController() {
            return new IOSInterfaceController();
        }
    }
    
    /**
     * Author: YiFan
     * Date: 2018/12/11 16:30
     * Description: 客户端
     */
    public class Test {
    
        public static void main(String[] args) {
            SystemFactory systemFactory;
            OperationController operationController;
            InterfaceController interfaceController;
            // (1)使用安卓系统工厂
            systemFactory = new AndiodSystemFactory();
            operationController = systemFactory.createOperationController();
            interfaceController = systemFactory.createInterfaceController();
            operationController.operationController();
            interfaceController.interfaceController();
        }
    }
    

    执行结果为:

    安卓系统操作控制
    安卓系统界面控制
    

    如果要使用苹果系统工厂,将代码(1)改成以下代码即可:

    systemFactory = new IOSSystemFactory();
    

    执行结果为:

    苹果系统操作控制
    苹果系统界面控制
    
  • 相关阅读:
    pagehelper 分页不生效,总页数总是1解决方案
    SpringBoot--⼯具表达式对象
    H5中input输入框tppe为date时赋值(回显)
    img标签无法显示src中名字中带有中文的图片的问题
    SpringBoot---条件(th:if)
    SpringBoot——静态资源映射规则
    SpringBoot——HelloWorld
    《从零开始学架构》读后感
    《从零开始学架构》笔记——第四部分:架构实战
    《从零开始学架构》笔记——第三部分:可扩展架构模式
  • 原文地址:https://www.cnblogs.com/shanyingwufeng/p/10184013.html
Copyright © 2011-2022 走看看