[设计模式整理笔记 二] 简单工厂模式(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();
        }
    }
}

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

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

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

 

原文地址:https://www.cnblogs.com/whtydn/p/1644085.html