平时在园子里看到有人质疑, 简单工厂模式到底是怎样设计的呢? 下面就来介绍一下它的含义。
简单的工厂模式,是属于创建型的模式, 创建型模式简单的理解就会创建对象并返回相应的实例。所以它关注的是谁创建它,它是怎样被创建的,以及何时创建这些方面给予你很大的灵活性。 具体的含义, 资料上是这样介绍: 简单工厂模式又叫静态工厂方法模式, 它定义一个具体的工厂类来负责创建一些类的实例。 也就是说, 这个类集合了部分功能类似或近似类的实例化, 例如子公司工资计算的类, 不管是那个子公司(因为子公司计算类都继承了ISalary接口, 所以有前面的相似或近似的特征), 要实例化时,都通过一个类来完成, 这类就是一个工厂类。 下面一起来看一下简单工厂模式是怎样创建工资计算模块的。
下面看看代码, 先创建接口,定义其方法:
namespace ConsoleApp
{
public interface ISalary
{
void CommandSalary();
}
}
二个子公司计算的类:
namespace ConsoleApp
{
public class ShenZhenSalary : ISalary
{
public void CommandSalary()
{
Console.WriteLine( " 这是深圳子公司的工资计算模块 " );
}
}
}
北京子公司实现的类:
namespace ConsoleApp
{
public class BeiJinSalary : ISalary
{
public void CommandSalary()
{
Console.WriteLine( " 这是北京子公司的工资计算模块 " );
}
}
}
当创建成这个样子后, 需要考虑的就是调用了, 是需要深圳子公司的时候直接实例化深圳子公司, 或直接实例北京子公司呢? 我们要讨论的就是这里, 下面看一下简单工厂模式的工厂类代码:
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;
}
}
}
上面的判断只是个说明工厂模式的样子, 这样做是不够好的, 后面将会介绍, 当你要用到深圳子公司或北京子公司计算模块的类的时候, 直接用这个工厂返回相应的实例就可以,代码如下:
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();
}
}
}
这样就完成的简单工厂模式的设计, 其实就是一个类(这里叫工厂类)专门来返回一些相似或近似(都继承某个类或接口的类)类的实例。
优点: 在调用的地方不需要负责类的实例化,类创建是由工厂类来返回相应的实例从而达到实例化的结果。符合面向对象里面单一职责的要求。
缺点:简单工厂模式是静态方法来创建的,所以这个工厂类无法被继承,如果要频繁的通过这个工厂类来实现化, 这个类会非常庞大, 不利于维护,所以必要时, 还需要把工厂类拆分成不同的小工厂类,例如: 为每一个子公司创建一个工厂类, 下篇将会介绍。