设计模式——三工厂

原创 2015年11月21日 11:05:07

    设计模式中的三工厂指简单工厂模式、工厂方法模式、抽象工厂模式。

       

    我们来逐步比较这三个模式的区别:

    简单工厂模式核心代码:

<span style="font-size:18px;">//简单运算工厂类</span>
<span style="font-size:18px;">Public class OperationFactoty
         {
         Public static Operation createOperate(stirng operate)
                   {
                            Operation oper = null;
                            Switch(operate)           //通过Switch实例化出合适的对象
                                     {
                                               Case “+”
                                                        Oper = new OperationAdd();
                                                        Break;
                                               Case”-”
                                                        Oper=new OperationSub();
                                                        Break;
                                               Case”*”
                                                        Oper= new OperationSub();
                                                        Break;
                                               Case”\”
                                                        Oper= new OperationDiv();
                                               Break;
                                      }
         Return oper;
                    }
        }                
 
客户端代码:
  Opeaton oper;
  Oper = OperationFactory.createOperate(“+”);   //输入"+",实例化出加法对象
  Oper.NumberA=1;
  Oper.NumberB=2;
  Double result = oper.Getresult();
</span>

       

       优点:工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态的实例化相关的类,对客户端来说,去除了与具体产品的依赖。

       缺点:如果要增加新的功能,需要在运算工厂类里加case,违背了开放—封闭原则。

 

       由此可见,我们只要在客户端输入相应的符号,我们的工厂就能实例化出合适的对象,如:我们的代码实例化出加法对象。

 

       在简单工厂模式的基础上我们再来看工厂方法模式,其核心代码如下:

<span style="font-size:18px;">//构建工厂接口</span>
<span style="font-size:18px;">Interface IFactory
    {
         Operation CreateOperation();
     }
 </span>
<span style="font-size:18px;">//构建具体工厂去实现这个接口
Class Addfactoty : IFactoty
    {
         Public Operation CreateOperation()
       {
         Return new OperationAdd();
        }
     }
 
Class SubFactoty : IFactoty
    {
         Public Operation CreateOperation()
         {
             Return new OperationSub();
          }
    }
 
Class MulFactoty : Ifactoty
   {
         Public Operation CreateOperation()
          {
                   Return new OperationMul();
           }
    }
 
Class DivFactoty : IFactory
   {
         Public Operation createOperation();
         {
                 Return new OperationDiv();
         }
    }
 
客户端代码:
   IFactoty operFactoty = new AddFactoty();   //实例化出加法工厂
   Operation oper= operFactoty.CreateOperation();
   Oper.NumberA =1;
   Oper.NumberB=2;
   Double result = oper.GetResult();
</span>

      工厂方法模式是对简单工厂模式违背开放——封闭原则的改进。

      工厂方法模式把工厂类抽象出一个接口,所有的要生产具体类的工厂去实现这个接口。

      优点:一个简单模式的工厂类,变成 了一个工厂抽象接口和多个具体生成对象的工厂,我们要增加功能时不需要再更改原有的工厂类,只需增加此功能的运算类和相应的工厂类。

 

      在工厂方法模式的基础上我们再来看抽象工厂模式

<span style="font-size:18px;">//IDepartment接口,用于客户端访问,解除与具体数据库访问的耦合</span>
<span style="font-size:18px;">Interface IDepartment
   {
        Void Insert (Department department);
        Department GetDepartment (int id);
   }</span>
<span style="font-size:18px;">
</span>
<span style="font-size:18px;">//SqlserverDepartment类,用于访问SQL Server的Department
Class SqlserverDepartment: IDepartment
   {
         Public void Insert(Department department)
           {
                   Console.WriteLine(“在SQL Server中给Department表增加一条记录”);
           }
       Public Department Getdepartment(int id)
          {
                  Console.WriteLine(“在SQL Server中根据ID得到Department表一条记录”);
                  Return null;
           }
   }</span>
<span style="font-size:18px;">
</span>
<span style="font-size:18px;"></span><pre name="code" class="csharp"><span style="font-size:18px;">//AccessDepartment</span><span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif;">类,用于访问Access的Department</span>
<pre name="code" class="csharp">Class AccessDepartment:IDepartment 
   { 
       Public void Insert(Department department) 
       { 
           Console.WriteLine(“在Access中给Department表增加一条记录”); 
       }
      Public Department GetDepartment(int id) 
         { 
            Console.WriteLine(“在Access中根据ID得到Department表一条记录”);
             Return null;
         }
   }




<span style="font-size:18px;">
</span>
<span style="font-size:18px;">//IFactoty接口,定义一个创建访问Department表对象的抽象工厂接口
Interface IFactoty
    {
         IUser CreateUser();
         IDepartment CreateDepartment();
     }

</span>
<span style="font-size:18px;"></span><pre name="code" class="csharp"><span style="font-size: 18px;">//SqlServerFactory类,实现IFactoty接口,实例化出SqlserverUser和SqlserverDepartment</span>

<span style="font-size:18px;">Class SqlServerFactory: IFactoty
   {
         Public IUser CreateUser()
             {
                   Return new SqlserverUser();
             }
         Public IDepartment CreateDepartment()
             {
                  Return new SqlserverDepartment();
              }
   }</span>
<span style="font-size:18px;">
</span>
<span style="font-size:18px;">//AccessFactoty类,实现IFactoty接口,实例化出AccessUser和AccessDepartment
Class AccessFactoty: IFactoty
   {
         Public IUser CreateUser()
            {
                   Return new AccessUser()
             }
         Public IDepartment CreateDepartment()
            {
                   Return new AccessDepartment ();
            }
    }
客户端代码
Static void
Main(string [] args)
  {
         User user = new User();
         Department dept = new Department();</span>
<span style="font-size:18px;"><span style="white-space:pre">	</span> //IFactory factoty =new SqlServerFactory();,确定实例化出哪个对象给factory
         IFactoty factory = new AccessFactoty();
</span><h1><span style="font-size:18px;">         IUser iu = factory.CreateUser();</span></h1><span style="font-size:18px;">         iu.Insert(user);
         iu.GetUser(1);
         IDepartment id=factory.CreateDepartment();
         id.Insert(dept);
         id.GetDepartment(1);
         console.read();   
   }      
</span>

       由以上代码我们可以看出当有一个工厂类,和工厂操作类的时候,我们要用工厂方法模式。


       那么什么情况下用抽象工厂模式呢?

       现在我们代码中所写的是给User类又增加一个Department类的结果,所以我们可以得出结论:当涉及到多个产品系列问题时,如代码中SQL Server与Access是两个不同分类,而这两个分类都涉及到User类和Department类,这时我们就可以使用抽象工厂类。

 

       简单工厂模式、工厂方法模式、抽象工厂模式之间是有递进关系的,能解决的问题由简到繁,逻辑上也相对复杂一点,把这三个放到一起去看,联系很紧密,差别也很明显。



版权声明:本文为博主原创文章,未经博主允许不得转载。

工厂三兄弟之简单工厂模式(一)

工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。本章将要学习的简单工厂模式是工厂方法模式的“小弟”,它不属于GoF 23种设计模式,但在软件...
  • LoveLion
  • LoveLion
  • 2013年07月11日 14:24
  • 22873

设计模式(一) 工厂模式 五种写法总结

转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52703280本文出自:【张旭童的博客】系列开篇瞎BB设计模式相关的文章学习与总结,一...
  • zxt0601
  • zxt0601
  • 2016年10月12日 16:47
  • 10167

23种设计模式—之简单工厂模式

简单工厂模式(SimpleFactory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实...
  • JavaWebRookie
  • JavaWebRookie
  • 2015年11月06日 13:46
  • 1989

设计模式【工厂方法模式】

本文主要是分享自己在学习设计模式过程中的心得与记录,有什么不当之处,望各位有心关注的看官,给予指证与说明。本文主要讲述【工厂方法模式】,望各位细细品读。【转载使用,请注明出处:http://blog....
  • ma_hoking
  • ma_hoking
  • 2014年09月23日 22:34
  • 1205

Spring中的设计模式--工厂方法模式

关于工厂模式的误会这是个老生常谈的问题,很多新手或者不太在意设计模式的同事会对工厂模式有极深的误解,总会把“工厂模式”与“静态工厂方法”混为一谈,什么是静态工厂方法呢?可以看一个非常简单的例子:pub...
  • zstu_cc
  • zstu_cc
  • 2017年01月02日 19:40
  • 3844

【设计模式】HeadFirst设计模式(四):工厂模式

设计模式要求我们不应该针对实现编程,为了降低耦合度,提高可维护性。当程序中出现“new”的时候,就证明程序在实例化一个具体类,所以用的是实现,而不是接口。如果代码绑着具体的类会导致代码更加脆弱,缺乏弹...
  • u010800530
  • u010800530
  • 2015年05月31日 22:47
  • 977

设计模式在cocos2d-x中的使用--简单工厂模式(Simple Factory)

什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个...
  • oktears
  • oktears
  • 2014年06月29日 15:40
  • 2159

工厂三兄弟之工厂方法模式(三)

3 完整解决方案        Sunny公司开发人员决定使用工厂方法模式来设计日志记录器,其基本结构如图3所示:图3 日志记录器结构图       在图3中,Logger接口充当抽象产品,其子类Fi...
  • LoveLion
  • LoveLion
  • 2013年07月12日 10:35
  • 17136

3. php的设计模式:从支付开始谈工厂模式

单纯的讲设计模式非常的没有意思,而且不利于理解与实践使用。我通过将工厂模式与开发中集成支付的场景进行结合讲解,相信大家能够很好的后面工作中实践工厂模式。...
  • hel12he
  • hel12he
  • 2016年06月18日 02:05
  • 930

工厂三兄弟之工厂方法模式(一)

简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背“开闭原则”,如何实现增加新产品而不影响...
  • LoveLion
  • LoveLion
  • 2013年07月12日 09:45
  • 17930
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式——三工厂
举报原因:
原因补充:

(最多只允许输入30个字)