• 设计模式(Java语言)- 工厂方法模式


      前言  

      在介绍工厂方法模式之前,我们需要知道这个设计模式是什么,解决了什么样的问题?在上一篇博客 设计模式(Java语言)- 简单工厂模式 介绍了简单工厂模式,然后总结了简单工厂模式的缺点:

        1、当新增类型时,我们不得不修改原来的工厂,这样就违背了设计模式6大原则中的 开闭原则。

        2、简单工厂模式使用了静态方法来创建对象,因此无法被实现或继承,从而导致改工厂类缺少灵活性,不易拓展。

        3、所有的类的创建都需要这个工厂类,因此系统已工厂类是强依赖的关系,一旦工厂类出现错误,将对整个系统产生比较大的影响。

      工厂方法模式就是解决上简单工厂模式的缺点。工厂方法模式UML类图:

       创建工厂方法模式步骤

      1、创建抽象产品类,定义接口。

      2、创建抽象工厂,定义具体工厂的接口。

      3、创建具体的产品类

      4、创建具体的工厂类

      5、客户端调用工厂类创建对象

      

      应用案例

      本模式我们加ing继续使用创建手机作为例子来讲解。我们根据上面的步骤来完成创建手机的流程:

      第一步定义抽象工厂方法:
    /**
     * @className: IphoneFactory
     * @description: iphone手机工厂类
     * @author: rainple
     * @create: 2020-01-21 20:52
     **/
    public class IphoneFactory implements PhoneFactory{
        @Override
        public Phone createPhone() {
            Iphone iphone = new Iphone();
            iphone.setName("iphone手机");
            return iphone;
        }
    }
      第二步创建抽奖产品类
    /**
     * @InterfaceName: Phone
     * @description: 抽象手机
     * @author: rainple
     * @create: 2020-01-21 20:48
     **/
    public abstract class Phone {
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
      第三步创建具体产品类
    /**
     * @className: Iphone
     * @description:
     * @author: rainple
     * @create: 2020-01-21 20:51
     **/
    public class Iphone extends Phone {
    
    }
    
    
    /**
     * @className: HuaWeiPhone
     * @description: 华为手机
     * @author: rainple
     * @create: 2020-01-21 20:52
     **/
    public class HuaWeiPhone extends Phone {
    
    }
      第四步创建具体的工厂方法
    /**
     * @className: HuaWeiFactory
     * @description: 华为手机工厂
     * @author: rainple
     * @create: 2020-01-21 21:04
     **/
    public class HuaWeiFactory implements PhoneFactory {
        @Override
        public Phone createPhone() {
            HuaWeiPhone huaWeiPhone = new HuaWeiPhone();
            huaWeiPhone.setName("华为手机");
            return huaWeiPhone;
        }
    }
    
    /**
     * @className: IphoneFactory
     * @description: iphone手机工厂类
     * @author: rainple
     * @create: 2020-01-21 20:52
     **/
    public class IphoneFactory implements PhoneFactory{
        @Override
        public Phone createPhone() {
            Iphone iphone = new Iphone();
            iphone.setName("iphone手机");
            return iphone;
        }
    }
      第五步客户端调用
    /**
     * @className: Client
     * @description: 客户端
     * @author: rainple
     * @create: 2020-01-21 21:06
     **/
    public class Client {
    
        public static void main(String[] args) {
            //iphone工厂
            PhoneFactory phoneFactory = new IphoneFactory();
            //创建iPhone手机
            Phone phone = phoneFactory.createPhone();
            System.out.println(phone.getName());
            //华为工厂
            phoneFactory = new HuaWeiFactory();
            //创建华为手机
            System.out.println(phoneFactory.createPhone().getName());
        }
    
    }

      

      总结

      一、优点

        1、遵循开闭原则,新增产品类时只需要增加相应的工厂以及产品即可,不需要修改原有的代码。

        2、符合单一职责原则,每个工厂类只负责一种产品的创建

        3、使用非静态方法来创建产品,利于后续对产品的拓展,可拓展性增加

      二、缺点

    • 每次增加新的产品时都需要对应的添加工厂类,当产品越来越多时系统创建类就越多,越来越复杂,不利于后期的维护。同时,类的创建和销毁可能会对系统造成一定的开销。
    • 一个工厂只能创建一种产品

      

  • 相关阅读:
    时间转换(scanf的指定格式读入)
    RabbitMQ (五)主题(Topic)
    第01章 概述(1)
    bitmap与2-bitmap使用总结
    MyEclipse开启Jquery智能提示
    开启unity3D的学习之路
    《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问
    使用squid架设自己的代理server
    Android KitKat 4.4平台开发-加入USB ADB和MTP功能支持
    Android:创建可穿戴应用
  • 原文地址:https://www.cnblogs.com/rainple/p/12227187.html
Copyright © 2020-2023  润新知