zoukankan      html  css  js  c++  java
  • 软件设计模式修炼 -- 简单工厂模式


    简单工厂模式是最简单的设计模式之一,虽然不属于二十三种设计模式,但应用也较为频繁。学习它也是学习其他创建型模式的基础


    模式动机

    在实际软件开发中,有时需创建一些来自于相同父类的类的实例,为此可以专门定义一个类来负责创建这些类的实例,这些被创建的实例具有共同的父类。习惯上将获得其他类实例的方法定义为static方法,外部不需要实例化这个类就可以直接调用该方法获得对象,该方法也称为静态工厂方法。


    模式定义

    简单工厂模式又称为静态工厂方法模式,根据参数的不同返回不同的类型的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。


    模式结构

    1. Factory(工厂角色)

      简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象;工厂中提供了静态的工厂方法,返回一个抽象产品类 Product,所有的具体产品类都是抽象产品的具体实现

    2. Product(抽象产品角色)

      抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例共有的公共接口

    3. ConcreteProduct(具体产品角色)

      具体产品角色是简单工厂模式的创建目标,继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法


    简单工厂模式实例之手机工厂

    1. 实例说明

      某手机厂专为各手机品牌生产手机,调用工厂的方法时传入参数,则根据传入的不同参数返回不同品牌的手机。

    2. 实例类图

      在这里插入图片描述

    3. 实例代码及解释

      1. 抽象产品类Phone

        public abstract class Phone {
        
            public abstract void use();
        }
        
      2. 具体产品类HuaweiPhone

        public class HuaweiPhone extends Phone {
            @Override
            public void use() {
                System.out.println("华为手机使用中....");
            }
        }
        
      3. 具体产品类XiaomiPhone

        public class XiaomiPhone extends Phone {
        
            @Override
            public void use() {
                System.out.println("小米手机使用中....");
            }
        }
        
      4. 工厂类PhoneFactory

        public class PhoneFactory {
        
            public static Phone producePhone(String brand) {
        
                if(brand.equalsIgnoreCase("huawei")) {
                    System.out.println("生产华为手机...");
                    return new HuaweiPhone();
                } else if (brand.equalsIgnoreCase("xiaomi")) {
                    System.out.println("生产小米手机");
                    return new XiaomiPhone();
                } else {
                    System.out.println("暂无该手机生产....");
                    return null;
                }
            }
        }
        
      5. 配置文件

        <?xml version="1.0" encoding="UTF-8" ?>
        <configuration>
            <!--
                通过从XML配置文件读取节点获取数据
             -->
            <brandName>huawei</brandName>
        </configuration>
        
      6. XML操作工具类

        public class XMLUtilPhone {
        
            public static String getBrandName() throws Exception {
        
                //创建解析器工厂
                DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
                //创建解析器
                DocumentBuilder builder = builderFactory.newDocumentBuilder();
                //得到document
                Document document = builder.parse("configPhone.xml");
                //获取包含品牌名称的文本节点
                NodeList brandNameList = document.getElementsByTagName("brandName");
                Node classNode = brandNameList.item(0).getFirstChild();
                String brandName = classNode.getNodeValue().trim();
        
                return brandName;
            }
        }
        
      7. 测试类

        public class Test {
        
            public static void main(String[] args) throws Exception {
                String brandName = XMLUtilPhone.getBrandName();
                Phone phone = PhoneFactory.producePhone(brandName);
                phone.use();
            }
        }
        
      8. 结果分析

        如果在配置文件中将节点内容设置为huawei,则输出结果为:
        在这里插入图片描述
        如果设置为vivo,则输出结果为:
        在这里插入图片描述

        如果希望系统支持生产vivo牌手机,则需要添加一个新的具体类VivoPhone,同时还需要修改工厂中的方法。因此简单工厂模式最大的问题在于工厂类的职责过于沉重,并且修改工厂类逻辑判断这一点是与开闭原则相违背的。


    模式优缺点

    简单工厂模式优点如下:

    1. 实现了对责任的分割,客户免除直接创建产品对象的责任,而仅仅消费产品
    2. 通过引入配置文件,可以在不修改客户端代码的情况下更换和增加新的具体产品类,提高系统灵活性

    简单工厂模式缺点如下:

    1. 工厂类集中了所有产品的创建逻辑,一旦不能正常工作,整个系统都将受到影响
    2. 使用简单工厂模式将增加系统中类的个数,在一定程度上增加系统的复杂度和理解难度
    3. 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,不利于系统维护
    4. 简单工厂模式使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构

  • 相关阅读:
    总结ASP.NET C#中经常用到的13个JS脚本代码
    C# 处理 JSON 常用的帮助类
    C# 中移动文件到指定位置
    C# 常用时间戳处理方法
    c#批量上传图片到服务器示例分享
    C# 通过URL获取图片并显示在PictureBox上的方法
    QT中Qtableview视图表格中点击表头进行排序
    qt QTableWidget&&QTableView 导出数据到excel
    51nod 1242 斐波那契数列的第N项
    矩阵快速幂
  • 原文地址:https://www.cnblogs.com/Yee-Q/p/12423183.html
Copyright © 2011-2022 走看看