python工业流程仿真_Python设计模式——工厂方法模式(FactoryMethod)

需求:有一个学雷锋活动,有买米和扫地两个内容,参与的人有大学生和社区志愿者,他们各自的方法不一样。

如果用简单工厂模式实现:

#encoding=utf-8

__author__ = 'kevinlu1010@qq.com'

classLeiFeng():defbuy_rice(self):pass

defsweep(self):pass

classStudent(LeiFeng):defbuy_rice(self):print '大学生帮你买米'

defsweep(self):print '大学生帮你扫地'

classVolunteer(LeiFeng):defbuy_rice(self):print '社区志愿者帮你买米'

defsweep(self):print '社区志愿者帮你扫地'

classLeiFengFactory():defcreate_lei_feng(self, type):

map_={'大学生': Student(),'社区志愿者': Volunteer()

}returnmap_[type]if __name__ == '__main__':

leifeng1= LeiFengFactory().create_lei_feng('大学生')

leifeng2= LeiFengFactory().create_lei_feng('大学生')

leifeng3= LeiFengFactory().create_lei_feng('大学生')

leifeng1.buy_rice()

leifeng1.sweep()

写一个雷锋类,定义买米和扫地两个方法,写一个学生类和社区志愿者类,继承雷锋类,写一个工厂类,根据输入的类型返回学生类或志愿者类。

用工厂方法模式实现:

#encoding=utf-8

__author__ = 'kevinlu1010@qq.com'

classLeiFeng():defbuy_rice(self):pass

defsweep(self):pass

classStudent(LeiFeng):defbuy_rice(self):print '大学生帮你买米'

defsweep(self):print '大学生帮你扫地'

classVolunteer(LeiFeng):defbuy_rice(self):print '社区志愿者帮你买米'

defsweep(self):print '社区志愿者帮你扫地'

classLeiFengFactory():defcreate_lei_feng(self):pass

classStudentFactory(LeiFengFactory):defcreate_lei_feng(self):returnStudent()classVolunteerFactory(LeiFengFactory):defcreate_lei_feng(self):returnVolunteer()if __name__ == '__main__':

myFactory=StudentFactory()

leifeng1=myFactory.create_lei_feng()

leifeng2=myFactory.create_lei_feng()

leifeng3=myFactory.create_lei_feng()

leifeng1.buy_rice()

leifeng1.sweep()

雷锋类,大学生类,志愿者类和简单工厂一样,新写一个工厂方法基类,定义一个工厂方法接口(工厂方法模式的工厂方法应该就是指这个方法),然后写一个学生工厂类,志愿者工厂类,重新工厂方法,返回各自的类。

工厂方法相对于简单工厂的优点:

1.在简单工厂中,如果需要新增类,例如加一个中学生类(MiddleStudent),就需要新写一个类,同时要修改工厂类的map_,加入'中学生':MiddleStudent()。这样就违背了封闭开放原则中的一个类写好后,尽量不要修改里面的内容,这个原则。而在工厂方法中,需要增加一个中学生类和一个中学生工厂类(MiddleStudentFactory),虽然比较繁琐,但是符合封闭开放原则。在工厂方法中,将判断输入的类型,返回相应的类这个过程从工厂类中移到了客户端中实现,所以当需要新增类是,也是要修改代码的,不过是改客户端的代码而不是工厂类的代码。

2.对代码的修改会更加方便。例如在客户端中,需要将Student的实现改为Volunteer,如果在简单工厂中,就需要把

leifeng1 = LeiFengFactory().create_lei_feng('大学生')

中的大学生改成社区志愿者,这里就需要改三处地方,但是在工厂方法中,只需要吧

myFactory =StudentFactory()

改成

myFactory =VolunteerFactory()

就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值