• 设计模式


    上一篇, 介绍了简单工厂模式, 在最后提出了一个问题, 如果我的程序需要扩展, 加一种产品进去, 显然, 简单工厂是不能胜任此项工作的, 那么需要另请高明 - 工厂方法模式. 当然, 抽象工厂, 也是可以加产品的, 动态添加程序集, 然后反射的方式就可以创建出我们新加的对象. 不过此处, 主要还是介绍工厂方法模式.

    一、工厂方法模式

    Normal, SUV, Sports 这几个类, 仍然沿用之前的, 不动. 此处, 主要是从工厂处开刀. 

    设计思想: 既然工厂返回值是变化的, 热插拔的, 那么我们能做的, 就是分析他们, 提取出他们的抽象部分. 之前的工厂是固定的, 现在我们为他们新建各自的工厂, 由各自的工厂负责创建他们的类, 然后把各自的工厂抽象出来, 形成一个工厂接口, 抽象类也是可以的. 这里就是哪里变化封装哪里的思想了.

    代码如下:

    public interface ICarFactory
    {
        Car Create();
    }
    
    public class NormalFactory : ICarFactory
    {
        public Car Create()
        {
            return new Normal();
        }
    }
    
    public class SUVFactory : ICarFactory
    {
        public Car Create()
        {
            return new SUV();
        }
    }
    
    public class SportsFactory : ICarFactory
    {
        public Car Create()
        {
            return new Sports();
        }
    }

    测试代码如下:

    static void Main(string[] args)
    {
        ICarFactory factory =  new NormalFactory();
        Car car = factory.Create();
        car.Start();
    
        Console.ReadKey();
    }

    结果如下:

    类图:

    到这里, 工厂方法已经浮出水面了, 接下来, 用这种方式, 去实现热插拔, 你会发现, 我丢, 在逗我吗? 这怎么可能实现功能. 好吧, 我承认, 程序写到这里, 还不能满足需求, 接下来, 还需要一个小的改动, 其实方法很简单. 修改如下:

    //<add key="CarFactory" value="Mod.SportsFactory"/>
    string factoryName = ConfigurationManager.AppSettings["CarFactory"];
    ICarFactory factory = (ICarFactory)Assembly.Load("Mod").CreateInstance(factoryName);
    Car car = factory.Create();
    car.Start();

    我们可以动态添加程序集, 只需要修改下配置文件中, 要创建的那个类名即可. 不需要去修改原来的代码, 还有一件同样重要的事情就是, 测试不会再叫了, 不需要测试以前的部分, 否则, 只要动代码, 就是给测试找活干, 会被打的. 哈哈

    这个例子, 本身就是一个比较好的用例场景了, 所以就不在给出别的用例场景了. 还是满符合设计原则的.

    在我们强大的反射面前, 其实不需要什么简单工厂啊, 工厂方法啊, 就可以直接实现, 创建出需要的类, 当然也可以, 动态添加程序集, 实现热插拔

    //<add key="CarName" value="Mod.Normal"/>
    string carName = ConfigurationManager.AppSettings["CarName"];
    Car car1 = (Car)Assembly.Load("Mod").CreateInstance(carName);
    car1.Start();
    
    Console.ReadKey();

    只不过, 这种实现方式, 就不是工厂模式的思想了, 具体使用哪种实现方式, 根据情况而定, 不要过, 也不要少.  嘿嘿, 换句话说, 就是不要给自己找事做, 合适即可.

  • 相关阅读:
    在C语言中,double、long、unsigned、int、char类型数据所占字节数
    SIFT算法的应用--目标识别之Bag-of-words模型
    公司笔试客观题
    程序的内存分配 CC++
    C++编程练习(14)-------“单例模式”的实现
    SSH框架:同一个工程之前可以正常运行,现在不能
    严重: Exception starting filter struts2 Unable to load configuration.
    Oracle SQL Developer出现错误 【ora-28002:the password will expire within 7 days】的解决办法
    jQuery 属性操作
    前端模块化开发应用——日历组件开发
  • 原文地址:https://www.cnblogs.com/elvinle/p/6109751.html
Copyright © 2020-2023  润新知