工厂方法模式VS简单工厂
来源:互联网 发布:caffe python接口配置 编辑:程序博客网 时间:2024/05/29 19:40
通过联系实际,我们利用一个学雷锋做好事的例子,来体会工厂方法模式和简单工厂的区别与联系。
1、写一个雷锋类,学生继承于雷锋,通过实例化多个对象去完成洗衣、打扫等方法。
2、但是学生都是短期的,如若我们需要增加一个长时间为老人服务的团体——社区志愿者类,同样继承于雷锋。再写出简单工厂类,运用多态,需要社区志愿者或学生时,客户端直接写出需要的指令,实例化不同的类(学生、志愿者两个类)。
代码如下:
//雷锋类 class LeiFeng { public void Wash() { Console.WriteLine("洗衣服"); } public void Clean() { Console.WriteLine("扫地"); } } //学雷锋的大学生,替雷锋做以上工作。 class Undergraduate:LeiFeng { } //长期的帮助老人的组织:社区志愿者 class Volunteer : LeiFeng { } //简单工厂: class SimpleFactory { public static LeiFengCreateLeiFeng(string type) { LeiFeng result = null; switch (type) { case "学雷锋的大学生": result = newUndergraduate(); break; case "社区志愿者": result=new Volunteer (); break ; } return result; } }
客户端代码:
//简单工厂模式: LeiFeng Z =SimpleFactory.CreateLeiFeng("学雷锋的大学生"); Z.Clean(); LeiFeng W =SimpleFactory.CreateLeiFeng("社区志愿者"); W.Wash(); //每实例化一个对象,就需要重复一次简单工厂的代码
问题出现了:
(1)、如果需要实例化多个对象,那么均需要不断增加、重复些实例化代码。
(2)、如果还需要增加一个类,为老人提供别的服务时,则又需要修改再写。
以上均违背了OCP原则(对扩展开放,对修改关闭)。由此引入工厂方法模式。
3、工厂模式,由于学生、社区志愿者均拥有相同的方法帮助老人,故写一个接口(雷锋工厂)。再写出学生、志愿者工厂,客户端便可直接需要学生或者志愿者时,直接将实例化工厂类换成相应的工厂即可。不需要重复写继承实现的代码。
代码如下:
//工厂方法模式 interface IFactory { LeiFeng CreateLeiFeng(); } //学雷锋的大学生工厂: class UndergraduateFactory:IFactory { public LeiFeng CreateLeiFeng() { return new Undergraduate(); } } //志愿者工厂: class VolunteerFactory : IFactory { public LeiFeng CreateLeiFeng() { return new Volunteer(); } }
客户端代码:
IFactory factory = new UndergraduateFactory(); LeiFeng L=factory .CreateLeiFeng(); L.Wash(); L.Clean(); IFactory fatory = newVolunteerFactory(); LeiFeng V =factory.CreateLeiFeng(); V.Clean();
以上三种方式运行结果均如下:
由此看出,工厂方法模式就是简单工厂的进一步升级,保持了简单工厂优点的同时,克服了其每增加一个功能就需要多写一个相应工厂类,违背OCP的缺点。
分享:
1、虽然通过直接写类继承、简单工厂、工厂方法这三种方式编写出来运行均能达到相同的显示结果,但是就设计思路的精密程度和代码的扩展性、维护性、灵活性而言,三者却不尽相同。横向一比较,便再一次明显的提醒我们:设计的最终目的不仅仅只是实现功能。
2、对于设计模式的学习,动手实践很重要。对理论阐述很容易感觉模糊。此时,一定要通过实践,敲例子来帮助加深理解。
希望以上内容,对您有所帮助。不足之处,请多多指教。
- 简单工厂模式 VS 工厂方法模式
- 简单工厂模式vs工厂方法模式
- 简单工厂模式 VS 工厂方法模式
- 简单工厂模式VS工厂方法模式
- 简单工厂模式VS工厂方法模式
- 工厂方法模式VS简单工厂模式
- 工厂方法模式 VS 简单工厂模式
- 简单工厂模式VS工厂方法模式
- 工厂方法模式VS简单工厂
- 【设计模式】简单工厂VS工厂方法
- 【设计模式】简单工厂VS工厂方法
- 简单工厂VS工厂方法
- 简单工厂VS工厂方法
- 简单工厂 VS 工厂方法
- 简单工厂VS工厂方法
- 简单工厂 vs 工厂方法
- 简单工厂VS工厂方法
- 简单工厂模式vs工厂方法模式vs抽象工厂模式
- 用php生成Excel文档 不适合做为数据源,我是为一个支付平台做Excel结果说不是标准的excel。但是样式很整齐
- 【Android-jni】JNI学习第一天
- 关于tapply函数 返回值的操作
- I. Counting 第八届北京邮电大学程序设计竞赛 - 热身赛 (1)
- ArrayList和数组间的相互转换
- 工厂方法模式VS简单工厂
- java常用排序算法
- Java如何读取Excel表中的数据-续
- ubuntu12.04 64位构建ARM交叉编译环境
- 看得懂吗?好莱坞电影中的神秘程序代码
- LBS-基于位置服务(Location Based Service)
- CurrentCulture
- START WITH...CONNECT BY PRIOR详解
- Implement strStr()