优点:
都是为了方便客户端,以及降低维护成本,因为代码都是松耦合的。
我的总结:
总结:就是有一个类,这个类不是实现具体的对象,而是一些将方法(动作)集成到一个类里面,这里的成员函数就是比如make啊,product的什么的,这些函数的返回值都是一些要生产的对象。就是这样而已。下面的代码都是这个套路。
1,工厂模式:知识点很多,很好。
目的:方便客户端的使用,比如这里是 让用户选择创建Dog或者Cat对象,并执行do_say()函数
from abc import ABCMeta,abstractmethod
'''
ABCMeta 这个东西是是为了生成抽象类的,这里测试了,没有他也可以,为保险起见还是加上吧!
@abstractmethod 被这个东西修饰的就是抽象函数
eval 的用法:在下面
设计继承类的好处就是统一规范,
'''
class Animal(metaclass=ABCMeta):
@abstractmethod
def do_say(self):
pass
class Dog(Animal):
def do_say(self):
print("dog dog!!")
class Cat(Animal):
def do_say(self):
print("Cat,cat")
class ForestFactory(object):
def make_sound(self,object_type):
'''
eval 的用法:参数是字符串,就是执行字符串所代表的程序。这里传入Dog
return eval(object_type)().do_say() 就等同于
return Dog().do_say()
'''
return eval(object_type)().do_say()
# 客户端代码:方便利索,这就是工厂模式的好处
if __name__ == '__main__':
print(eval("1+3"))#输出 4
ff = ForestFactory()
animal = input("which naimal should make_sound Dog or Cat?")
a = ff.make_sound(animal)
pass
2,抽象工厂的另一种写法:
'''
'''
class Mercedes(object):
"""梅赛德斯
"""
def __repr__(self):
return "Mercedes-Benz"
class BMW(object):
"""宝马
"""
def __repr__(self):
return "BMW"
class SimpleCarFactory(object):
"""简单工厂
"""
@staticmethod
def product_car(name):
'''
这种实现方法和第一种方法一样的道理,只不过,前面的用input手动输入而已
'''
if name == 'mb':
return Mercedes()
elif name == 'bmw':
return BMW()
if __name__ == '__main__':
c1 = SimpleCarFactory.product_car('mb')
c2 = SimpleCarFactory.product_car('bmw')
print(c1,c2)
上面的第二种代码:虽然有了一个简单的工厂,但在实际使用工厂的过程中,我们会发现新问题:如果我们要新增一个“产品”,例如Audi的汽车,我们除了新增一个Audi类外还要修改SimpleCarFactory内的product_car方法。这样就违背了软件设计中的开闭原则[1],即在扩展新的类时,尽量不要修改原有代码。所以我们在简单工厂的基础上把SimpleCarFactory抽象成不同的工厂,每个工厂对应生成自己的产品,这就是工厂方法。
解决方法
'''
'''
class Mercedes(object):
"""梅赛德斯
"""
def __repr__(self):
return "Mercedes-Benz"
class BMW(object):
"""宝马
"""
def __repr__(self):
return "BMW"
# ===================================
import abc
class AbstractFactory(object):
"""抽象工厂
"""
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def product_car(self):
pass
class MercedesFactory(AbstractFactory):
"""梅赛德斯工厂
"""
def product_car(self):
return Mercedes()
class BMWFactory(AbstractFactory):
"""宝马工厂
"""
def product_car(self):
return BMW()
if __name__ == '__main__':
c1 = MercedesFactory().product_car()
c2 = BMWFactory().product_car()
print(c1,c2)
上面代码还有缺点:
工厂方法虽然解决了我们“修改代码”的问题,但如果我们要生产很多产品,就会发现我们同样需要写很多对应的工厂类。比如如果MercedesFactory和BMWFactory不仅生产小汽车,还要生产SUV,那我们用工厂方法就要再多构造两个生产SUV的工厂类。所以为了解决这个问题,我们就要再更进一步的抽象工厂类,让一个工厂可以生产同一类的多个产品,这就是抽象工厂。具体实现如下:
import abc
# =================================两种小汽车==================================
class Mercedes_C63(object):
"""梅赛德斯 C63
"""
def __repr__(self):
return "Mercedes-Benz: C63"
class BMW_M3(object):
"""宝马 M3
"""
def __repr__(self):
return "BMW: M3"
# ===================================两种SUV=====================================
class Mercedes_G63(object):
"""梅赛德斯 G63
"""
def __repr__(self):
return "Mercedes-Benz: G63"
class BMW_X5(object):
"""宝马 X5
"""
def __repr__(self):
return "BMW: X5"
# ======================================抽象工厂
class AbstractFactory(object):
"""抽象工厂
可以生产小汽车外,还可以生产SUV
"""
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def product_car(self):
pass
@abc.abstractmethod
def product_suv(self):
pass
#=====================================实现抽象工厂
class MercedesFactory(AbstractFactory):
"""梅赛德斯工厂
"""
def product_car(self):
return Mercedes_C63()
def product_suv(self):
return Mercedes_G63()
class BMWFactory(AbstractFactory):
"""宝马工厂
"""
def product_car(self):
return BMW_M3()
def product_suv(self):
return BMW_X5()
if __name__ == '__main__':
c1 = MercedesFactory().product_car() # 梅赛德斯工厂 可以生产car
s1 = MercedesFactory().product_suv() # 梅赛德斯工厂 可以生产SUV
print(c1, s1)
s2 = BMWFactory().product_suv() # 宝马同理
c2 = BMWFactory().product_car()
print(c2, s2)
高级实例-创建Facebook账号实例