设计模式(4)-抽象工厂模式及抽象工厂与工厂模式的区别

其实在看到抽象工厂模式的时候,属实让我纠结了好久。这个抽象工厂模式和工厂模式有啥区别呢?感觉比工厂模式复制了好多,但是用起来貌似还没什么具体的区别。总有一种似是而非的感觉。貌似有区别,又貌似没区别。

可是既然是两种设计模式,总是有区别的吧?

网上查到资料总是这么说:

工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类;

抽象工厂模式:为创建一组或相互依赖的对象提供一个接口,而且无需指定他们的具体类。


字面意思看明白了,可是还有没明白。懵!

还有说区别在于产品,如果产品单一,最适合用工厂模式,但是如果有多个业务品种,业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

其实还是不太明白。

后来看到一句话,我悟了:

区别在于,抽象工厂里一个工厂要生产多个产品,当抽象工厂生产的产品只有一个时,就叫工厂模式了

说的是呐。原来这样。明白了。

比如,上文说的各种食物,每个食物有一个单一的工厂类。

我们知道现在各个快餐都有一种套餐的形式,可以让我们不用纠结一样一样的选。这样我们就可以通过套餐来选择了。

用到设计模式中,也就是,把一个一个的食物再进行抽象,然后再分类,然后在工厂中,每次返回一种食物,改为返回多种食物,那么就是抽象工厂模式了。


我理解的就是这样的,可以给大家参考一下。


继续上代码,这次把产品再抽象分为吃的和喝的两种,然后工厂类返回一个吃的和一个喝的,就是抽象工厂模式了。

    // 食物虚类
    public abstract class KFCFood
    {
        public abstract string GetFood();
    }

    // 原味鸡
    public class KFCYuanweiji : KFCFood
    {
        public override string GetFood()
        {
            return "原味鸡";
        }
    }

    // 蛋挞
    public class KFCDanta : KFCFood
    {
        public override string GetFood()
        {
            return "蛋挞";
        }
    }

    // 奥尔良鸡腿堡
    public class KFCAoerliang : KFCFood
    {
        public override string GetFood()
        {
            return "奥尔良鸡腿堡";
        }
    }

    // 饮料虚类
    public abstract class KFCDrink
    {
        public abstract string GetDrink();
    }

    // 百事可乐
    public class PepsleCola : KFCDrink
    {
        public override string GetDrink()
        {
            return "百事可乐";
        }
    }

    // 豆浆
    public class Doujiang : KFCDrink
    {
        public override string GetDrink()
        {
            return "豆浆";
        }
    }

    // 咖啡
    public class Coffee : KFCDrink
    {
        public override string GetDrink()
        {
            return "阿拉比咖啡";
        }
    }

    // 套餐虚类即工厂类
    public abstract class Package
    {
        public override KFCFood CreateFood();
        public override KFCDrink CreateDrink();
    }

    // 套餐子类即工厂子类
    public class CheapPackage : Package
    {
        public KFCFood CreateFood()
        {
            return new KFCYuanweiji();
        }

        public KFCDrink CreateDrink()
        {
            return new Doujiang();
        }
    }
    // 套餐子类即工厂子类
    public class HighPricePackage : Package
    {
        public KFCFood CreateFood()
        {
            return new KFCYuanweiji();
        }

        public KFCDrink CreateDrink()
        {
            return new Coffee();
        }
    }

然后客户端这样调用。

            Package package = new CheapPackage();
            KFCFood food = package.CreateFood();
            food.GetFood();

            KFCDrink drink = package.CreateDrink();
            drink.GetDrink();


这样就可以了。


知行办公,专业移动办公平台
 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;
【安全】保密,你懂的。 











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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值