zoukankan      html  css  js  c++  java
  • 设计模式之工厂模式(Factory)

    工厂模式

    1.简单工厂(不属于23种)

    概念:简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例

    实现:定义一个创建对象的类,由这个类来封装实例化对象的行为

    应用场景:当我们会大量地创建某种、某类或者某批产品时,可以使用简单工厂模式

    如图一,Pizza是一个抽象类,CheessPizza和GreekPizza为实现类,多个OrderPizza可以根据需求创建Pizza对象,然而这种做法在增加新的实现类时,我们要把每个OrderPizza的具体实现都重新更改,十分不合理

    如图二,通过简单工厂的方式,我们可以将Pizza作为PizzaFactory的聚合对象,在Factory中调用方法统一创建Pizza对象实例然后返回,每个OrderPizza中聚合了一个Factory对象,直接根据用户输入来调用Factory中的方法来获取 Pizza对象,当增加新的Pizza实现类时,只需要修改Factory中的创建规则,不需要修改每一个OrderPizza

    也可以将工厂中的方法定义为静态方法,这样OrderPizza可以直接调用PizzaFactory.getPizza()方法来创建披萨,看需求

    2.工厂方法模式

    思路:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将都对象的实例化推迟到了子类

    我们将简单工厂中的例子进阶,现在我们不仅有多个种类的披萨,还有多个地区,即北京披萨和天津披萨等,这里简单工厂便不再适用,采取如下的结构,BJOrderPizza和TJOrderPizza就类似于简单工厂,但它们继承于OrderPizza抽象类,该类为一个总的工厂,提供了一个创建pizza实例的抽象方法,由子类各自去实现

    3.抽象工厂模式

    概念:定义了一个interface用于创建相关或者有依赖关系的对象簇,而无需指明具体的类;可以将抽象工厂模式看成简单工厂和工厂方法的整合

    如下,我们定义一个工厂接口,抽象工厂的好处在于还可以再生产更多的产品,创建好对应的产品,在Factory接口中定义多一个对应的方法,由子类实现,使用方的只需要聚合Factory接口,对应创建工厂实例,就可以创建产品对象;无论时增加新的厂商还是增加新的产品,只需要在提供方增加相应的类,在使用方都是调用Factory接口的方法来实现,则完美遵守开闭原则

    • 当只有一种产品时,抽象工厂等于工厂方法,当有多种产品是就不再是工厂方法而是抽象工厂

    JDK源码示例

    简单工厂:Calender对象实例的创建使用了简单工厂

    public static Calendar getInstance()
    {
        return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
    }    
    
    private static Calendar createCalendar(TimeZone zone,
                                           Locale aLocale)
    {
    
        .........................................................
    
        //声明实例对象
        Calendar cal = null;
    
        //通过判断传入的后缀来决定创建的实例类型
        if (aLocale.hasExtensions()) {
            String caltype = aLocale.getUnicodeLocaleType("ca");
            if (caltype != null) {
                switch (caltype) {
                case "buddhist":
                cal = new BuddhistCalendar(zone, aLocale);
                    break;
                case "japanese":
                    cal = new JapaneseImperialCalendar(zone, aLocale);
                    break;
                case "gregory":
                    cal = new GregorianCalendar(zone, aLocale);
                    break;
                }
            }
        }
      .....................................
    }
    

    小结

    1. 工厂模式的意义

      将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到项目解耦的目的,提高了项目的扩展性和可维护性

    2. 工厂模式的依赖抽象原则

      • 创建对象实例时,不要直接new类,而是要在工厂的方法中new,即变量不要直接持有具体类的引用
      • 不要让类直接继承具体类,而是要继承抽象类或者实现接口
      • 不要覆盖基类中的方法
  • 相关阅读:
    luogu P1455 搭配购买
    浅谈筛素数
    luogu P1205 方块转换
    luogu P2241 统计方形
    luogu P1866 编号
    luogu P1042 乒乓球
    4.7清明考试(完蛋)
    LINUX 启动图形界面和查看运行级别
    密钥登录LINUX步骤
    服务命令只支持基本的LSB操作(启动、停止、重新启动、尝试重启、重新加载、强制重新加载、状态)。对于其他操作,请尝试使用systemctl。
  • 原文地址:https://www.cnblogs.com/JIATCODE/p/13055281.html
Copyright © 2011-2022 走看看