【设计模式之四:工厂模式对比】简单工厂、工厂方法和抽象工厂的区别

在做.net机房收费系统画图阶段,重新认识了一下简单工厂与抽象工厂!

从细节处看出它们的不同应用

 

下面写一下简单工厂的工厂类:

[csharp]  view plain copy print ?
  1. class CashFactory  
  2.    {  
  3.        public static CashSuper createCashAccept(string type)  
  4.        {  
  5.            CashSuper cs = null;  
  6.            switch (type)  
  7.            {  
  8.                case "正常收费":  
  9.                    cs = new CashNormal();  
  10.   
  11.                    break;  
  12.                case "满300返100":  
  13.                    CashReturn cr1 = new CashReturn("300""100");  
  14.                    cs = cr1;  
  15.                    break;  
  16.                case "打八折":  
  17.                    CashRebate cr2 = new CashRebate("0.8");  
  18.                    cs = cr2;  
  19.                    break;  
  20.   
  21.            }  
  22.            return cs;  
  23.   
  24.        }  

    在创建工厂时使用了参数,目的是根据参数来实例化具体类,简单工厂解决的是一个功能有多种实现,且我需要将不同的实现均实例出来.应用时,我创建的这些实例都可能应用的到.

    以前我的理解是抽象工厂是简单工厂的延续,理所当然的抽象工厂也能解决简单工厂的问题,但是真的用的时候,发现并不是如此,大家看看代码:


抽象工厂:       

[csharp]  view plain copy print ?
  1. //IFactory接口  
  2.        interface IFactory  
  3.        {  
  4.            Iuser createUser();  
  5.   IDpartment CreateDepartment();  
  6.        }  
  7.        //SQLServerFactory类,实现IFactory接口,实例化SQLServerUser  
  8.        class SQLServerFactory : IFactory  
  9.        {  
  10.            public Iuser createUser()  
  11.            {  
  12.                return new SQLServerUser();  
  13.            }  
  14.    public IDepartment createDepartment()  
  15.    {  
  16.        return new SQLServerUser();  
  17.    }  
  18.           
  19.   
  20.        }  
  21.        //AccessFactory类,实现IFactory接口,实例化AccessUser  
  22.        class AccessFactory : IFactory  
  23.        {  
  24.            public Iuser createUser()  
  25.            {  
  26.                return new AccessUser();  
  27.            }  
  28.                 public IDepartment createDepartment()  
  29.            {  
  30.                return new AccessDepartment();  
  31.            }  
  32.   
  33.   
  34.        }  


    抽象工厂没有使用参数,解决的是一个功能我只需要一种实现方式的问题,虽然我有多种实现的方法,但是在使用时我只需要选择其一.应用时,我只需要将我想创建的实例创建出来即可,不使用的实例可以不创建.它主要解决整个功能有两种不同的实现,在用的过程中只选择其中的一种!

 

   通过这个细节又让我想到当时总结的设计模式之工厂模式,下面我再将三种工厂模式的比较贴过来和大家分享:

       

三种工厂模式对比:

 

简单工厂:简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。不修改代码的话,是无法扩展的。

工厂方法:工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品。

抽象工厂:抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。


举例说明:

 

  简单工厂的由来:以前都是我自己生产自己的汽车(自产自用),这样的话我和汽车之间就是强耦合,没有我就没办法生产。

   简单工厂:一个汽车公司将各种各样的汽车生产都放在了一个工厂里实现(工厂只负责生产,我只负责使用,降低了我和汽车之间的耦合)

   工厂方法:汽车公司将不同种的汽车在不同的工厂内实现.例如:轿车在生产轿车的工厂生产,汽车在生产汽车的工厂生产等(增加新的产品)。

   抽象工厂:一个汽车公司同时生产汽车,轿车,客车,那么这个汽车公司的每个工厂都要实现生产汽车,轿车,客车的方法。当我要生产各种汽车的不同品牌时,则需要使用抽象工厂模式。也就是产品族的概念。(增加产业线)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值