设计模式(3)-工厂模式

上次说到简单工厂模式。也说到了简单工厂模式的缺点,在增加内容的时候,需要修改简单工厂的逻辑,增加内容。

这显然是违反设计原则中的“开闭原则”的。回忆一下开闭原则是什么呢?就是对拓展开放,对修改封闭。但是这种方式显然是没办法拓展了。


所以,还是需要更先进的工厂模式。

当然设计模式并没有优劣之分的,用一位大神的话说,所谓设计模式就是为了偷懒的产物,它可以让我们更好的维护我们的代码,当我们增加或修改某些内容的时候,不需要废太大的力气。

如果,你感觉一种设计模式会增加你的工作量,那么你一定是用错了。

很赞同大神的观点。


不过像之前的模式中,确实需要一遍一遍的修改工厂类,确实麻烦。

接下来,结合自己所学,说说工厂模式。

工厂模式就是把众多的内容提炼出一个具有N多共性的工厂虚类,而对象的实现则放在这个工厂虚类的具体子类中。客户端调用的时候,只要使用虚类接收子类的对象,就可以为所欲为了。呃,也不算为所欲为吧,换个说法,做可以做的事吧。我是这么理解的。No code No 理解。咱们看代码。

工厂模式要有几个内容:

1、工厂虚类(要有子类工厂的特性)

2、继承虚类的具体子类

3、产品虚类(要有产品子类的特性)

4、继承产品虚类的具体子类


    // 产品虚类
    public abstract class Food
    {
        public abstract string GetFood();
    }

    // 产品子类1
    public class Yuanweiji : Food
    {
        public override string GetFood()
        {
            return "原味鸡";
        }
    }

    // 产品子类2
    public class Danta : Food
    {
        public override string GetFood()
        {
            return "蛋挞";
        }
    }

    // 工厂虚类
    public abstract class Cooker
    {
        public abstract Food CreateFood();
    }

    // 工厂子类1
    public class YuanweijiCooker : Cooker
    {
        public override Food CreateFood()
        {
            return new Yuanweiji();
        }
    }

    // 工厂子类2
    public class DantaCooker : Cooker
    {
        public override Food CreateFood()
        {
            return new Danta();
        }
    }

然后,客户端这样进行调用

            // 用工厂虚类对象接收原味鸡工厂子类的对象,这样就得到了原味鸡工厂
        Cooker yuanweijiCooker = new YuanweijiCooker();
        // 用产品虚类对象接收原味鸡子类的对象,就可以得到原味鸡了
        Food yuanweiji = yuanweijiCooker.CreateFood();
        // 最后输出,看你得到的是不是原味鸡,别给错了
        Response.Write(yuanweiji.GetFood() + "<br/>");

这样,如果我要增加一种产品奥尔良鸡腿堡,就只要在增加一个产品子类和一个工厂子类

    // 产品子类3
    public class Aoerliang : Food
    {
        public override string GetFood()
        {
            return "奥尔良鸡腿堡";
        }
    }
    // 工厂子类3
    public class AoerliangCooker : Cooker
    {
        public override Food CreateFood()
        {
            return new Aoerliang();
        }
    }

然后客户端按照之前的方式调用就可以了。

            Cooker aoerliangCooker = new AoerliangCooker();
            Food  aoerliang = aoerliangCooker.CreateFood();
            Response.Write(aoerliang.GetFood() + "<br/>");


这样是不是就增加了程序的可维护性呢?而不需要增加一个产品就修改一下工厂类。这样真的方便很多不是么?



知行办公,专业移动办公平台
 https://zx.naton.cn/
【总监】十二春秋之,3483099@qq.com;
【Master】zelo,616701261@qq.com;
【运营】运维艄公,897221533@qq.com;
【产品设计】流浪猫,364994559@qq.com;
【体验设计】兜兜,2435632247@qq.com;
【iOS】淘码小工,492395860@qq.com;iMcG33K,imcg33k@gmail.com;
【Android】人猿居士,1059604515@qq.com;思路的顿悟,1217022114@qq.com;
【java】首席工程师MR_W,feixue300@qq.com;
【测试】土镜问道,847071279@qq.com;
【数据】fox009521,42151960@qq.com;
【安全】保密,你懂的。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值