在做.net机房收费系统画图阶段,重新认识了一下简单工厂与抽象工厂!
从细节处看出它们的不同应用
下面写一下简单工厂的工厂类:
class CashFactory { public static CashSuper createCashAccept(string type) { CashSuper cs = null; switch (type) { case "正常收费": cs = new CashNormal(); break; case "满300返100": CashReturn cr1 = new CashReturn("300", "100"); cs = cr1; break; case "打八折": CashRebate cr2 = new CashRebate("0.8"); cs = cr2; break; } return cs; }
在创建工厂时使用了参数,目的是根据参数来实例化具体类,解决的是一个功能有多种实现,且我需要将不同的实现均实例出来.应用时,我创建的这些实例都可能应用的到.
以前我的理解是抽象工厂是简单工厂的延续,理所当然的抽象工厂也能解决简单工厂的问题,但是真的用的时候,发现并不是如此,大家看看代码:
抽象工厂:
//IFactory接口 interface IFactory { Iuser createUser(); IDpartment CreateDepartment(); } //SQLServerFactory类,实现IFactory接口,实例化SQLServerUser class SQLServerFactory : IFactory { public Iuser createUser() { return new SQLServerUser(); } public IDepartment createDepartment() { return new SQLServerUser(); } } //AccessFactory类,实现IFactory接口,实例化AccessUser class AccessFactory : IFactory { public Iuser createUser() { return new AccessUser(); } public IDepartment createDepartment() { return new AccessDepartment(); } }
抽象工厂没有使用参数,解决的是一个功能我只需要一种实现方式的问题,虽然我有多种实现的方法,但是在使用时我只需要选择其一.应用时,我只需要将我想创建的实例创建出来即可,不使用的实例可以不创建.它主要解决整个功能有两种不同的实现,在用的过程中只选择其中的一种!
通过这个细节又让我想到当时总结的设计模式之工厂模式,下面我再将三种工厂模式的比较贴过来和大家分享:
三种工厂模式对比:
简单工厂:简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。不修改代码的话,是无法扩展的。
工厂方法:工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品。
抽象工厂:抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。
举例说明:
简单工厂的由来:以前都是我自己生产自己的汽车(自产自用),这样的话我和汽车之间就是强耦合,没有我就没办法生产。
简单工厂:一个汽车公司将各种各样的汽车生产都放在了一个工厂里实现(工厂只负责生产,我只负责使用,降低了我和汽车之间的耦合)
工厂方法:汽车公司将不同种的汽车在不同的工厂内实现.例如:轿车在生产轿车的工厂生产,汽车在生产汽车的工厂生产等(增加新的产品)。
抽象工厂:一个汽车公司同时生产汽车,轿车,客车,那么这个汽车公司的每个工厂都要实现生产汽车,轿车,客车的方法。当我要生产各种汽车的不同品牌时,则需要使用抽象工厂模式。也就是产品族的概念。(增加产业线)