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

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

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

 

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值