您的位置:首页 > 其它

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

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

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

}

}

}




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

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

缺点:简单工厂模式是静态方法来创建的,所以这个工厂类无法被继承,如果要频繁的通过这个工厂类来实现化, 这个类会非常庞大, 不利于维护,所以必要时, 还需要把工厂类拆分成不同的小工厂类,例如: 为每一个子公司创建一个工厂类, 下篇将会介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: