设计模式(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;
【安全】保密,你懂的。
- 设计模式(4)-抽象工厂模式及抽象工厂与工厂模式的区别
- 设计模式——抽象工厂模式及与工厂模式的区别
- 设计模式--(1)工厂模式与抽象工厂模式
- 抽象工厂模式、简单工厂模式、工厂模式的区别
- 简单工厂模式、工厂模式、抽象工厂模式的区别
- 工厂方法模式与抽象工厂模式的区别
- 抽象工厂模式与工厂方法模式的区别
- 工厂方法模式与抽象工厂模式的区别
- 工厂方法模式与抽象工厂模式的区别
- 工厂方法模式与抽象工厂模式的区别
- 工厂方法模式与抽象工厂模式的区别
- 工厂方法模式与抽象工厂模式的区别
- 工厂模式与抽象工厂模式的区别
- 工厂模式与抽象工厂
- 【设计模式】简单工厂模式、工厂方法模式和抽象工厂模式区别与联系
- 抽象工厂设计模式
- 设计模式-----抽象工厂
- 抽象工厂设计模式
- MyBatis的Mapper接口以及Example的实例函数及详解
- 软件测试中我们一般会遇到三角形和年月日的问题
- Spring(1)—初识
- Uva 10391
- JAVA 基础知识 数组
- 设计模式(4)-抽象工厂模式及抽象工厂与工厂模式的区别
- Javascript模块化编程(三):require.js的用法
- mysql(10):基础,ORDER 子句的语法介绍
- MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications论文笔记
- jQuery –AJAX
- day04_innerHTML属性
- Qt+OpenCV以时间命名视频名字
- Mindjet MindManager 2018(思维导图)官方注册版64位V2018.18.1.154下载 | mindmanager中文破解版
- importError: No module named site