zoukankan      html  css  js  c++  java
  • [设计模式整理笔记 二] 简单工厂模式(Simple Factory)

    [导读]

    [设计模式整理笔记 一] 基础知识

    [设计模式整理笔记 二] 简单工厂模式(Simple Factory)

    [设计模式整理笔记 三] 工厂模式(Factory)

    [设计模式整理笔记 四] 抽象工厂模式(Abstract Factory)

    [设计模式整理笔记 五] 创建者模式(Builder)

    [设计模式整理笔记 六] 工厂模式与创建者模式总结

    [设计模式整理笔记 七] 原型模式(ProtoType)

    [设计模式整理笔记 八] 单例模式(Singleton)

    [设计模式整理笔记 九] 外观模式(Facade)

    ....后续, 包括部分例子

    [/导读]

     

    平时在园子里看到有人质疑, 简单工厂模式到底是怎样设计的呢? 下面就来介绍一下它的含义。

    简单的工厂模式,是属于创建型的模式, 创建型模式简单的理解就会创建对象并返回相应的实例。所以它关注的是谁创建它,它是怎样被创建的,以及何时创建这些方面给予你很大的灵活性。 具体的含义, 资料上是这样介绍: 简单工厂模式又叫静态工厂方法模式, 它定义一个具体的工厂类来负责创建一些类的实例。 也就是说, 这个类集合了部分功能类似或近似类的实例化, 例如子公司工资计算的类, 不管是那个子公司(因为子公司计算类都继承了ISalary接口, 所以有前面的相似或近似的特征), 要实例化时,都通过一个类来完成, 这类就是一个工厂类。 下面一起来看一下简单工厂模式是怎样创建工资计算模块的。

    下面看看代码, 先创建接口,定义其方法:

    using System;

    namespace ConsoleApp
    {
        
    public interface ISalary
        {
            
    void CommandSalary();
        }
    }

    二个子公司计算的类:

    代码
    using System;

    namespace ConsoleApp
    {
        
    public class ShenZhenSalary : ISalary
        {
            
    public void CommandSalary()
            {
                Console.WriteLine(
    "这是深圳子公司的工资计算模块");
            }
        }
    }

    北京子公司实现的类:

    代码
    using System;

    namespace ConsoleApp
    {
        
    public class BeiJinSalary : ISalary
        {
            
    public void CommandSalary()
            {
                Console.WriteLine(
    "这是北京子公司的工资计算模块");
            }
        }
    }

    当创建成这个样子后, 需要考虑的就是调用了, 是需要深圳子公司的时候直接实例化深圳子公司, 或直接实例北京子公司呢? 我们要讨论的就是这里, 下面看一下简单工厂模式的工厂类代码:

     

    代码
    using System;

    namespace ConsoleApp
    {
        
    public class SalaryFactory
        {
            
    /// <summary>
            
    /// 通过传进的公司名返回相应的实例
            
    /// </summary>
            
    /// <param name="CompanyName">子公司的名称</param>
            
    /// <returns></returns>
            public static ISalary CreateSalary(string CompanyName)
            {
                ISalary Salary 
    = null;
                
    if (CompanyName == "ShenZhen")  //这里可以通过更多方法来判断,通过不同的名返回相应的实例
                {
                    Salary 
    = new ShenZhenSalary();
                }
                
    else if (CompanyName == "BeiJin")
                {
                    Salary 
    = new BeiJinSalary();
                }

                
    return Salary;
            }
        }
    }

    上面的判断只是个说明工厂模式的样子, 这样做是不够好的, 后面将会介绍, 当你要用到深圳子公司或北京子公司计算模块的类的时候, 直接用这个工厂返回相应的实例就可以,代码如下:

    代码
    using System;

    namespace ConsoleApp
    {
        
    class Program
        {
            
    public static void Main(string[] args)
            {
                
    //程序代码中调用北京子公司如下
                ISalary SalaryBJ = SalaryFactory.CreateSalary("BeiJin");  //需要调用子公司的工资计算过程时, 把子公司的名称传进去
                SalaryBJ.CommandSalary();

                
    /*这里有好多其它的代码*/

                
    //程序代码中调用深圳子公司如下
                ISalary SalarySZ = SalaryFactory.CreateSalary("ShenZhen");  //需要调用子公司的工资计算过程时, 把子公司的名称传进去
                SalarySZ.CommandSalary();


                Console.ReadLine();
            }
        }
    }

    这样就完成的简单工厂模式的设计, 其实就是一个类(这里叫工厂类)专门来返回一些相似或近似(都继承某个类或接口的类)类的实例。

    优点: 在调用的地方不需要负责类的实例化,类创建是由工厂类来返回相应的实例从而达到实例化的结果。符合面向对象里面单一职责的要求。

    缺点:简单工厂模式是静态方法来创建的,所以这个工厂类无法被继承,如果要频繁的通过这个工厂类来实现化, 这个类会非常庞大, 不利于维护,所以必要时, 还需要把工厂类拆分成不同的小工厂类,例如: 为每一个子公司创建一个工厂类, 下篇将会介绍。

     

  • 相关阅读:
    lombok 的使用
    SpringData Redis 常见操作(基于模板类RedisTemplate )
    Django,静态文件配置
    django简介与MTV,MVC
    HTTP请求响应,及工作原理
    阿萨斯

    javastrip
    css
    html
  • 原文地址:https://www.cnblogs.com/whtydn/p/1644085.html
Copyright © 2011-2022 走看看