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

来源:互联网 发布:狸窝mp4视频转换器mac 编辑:程序博客网 时间:2024/05/18 03:25

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

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

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

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

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


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

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

其实还是不太明白。

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

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

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

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

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

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


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


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

    // 食物虚类    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
原创粉丝点击