首先声明:此文档出处为以下:
版权声明:本文为CSDN博主「Burgess_zheng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Burgess_zheng/article/details/86762248
urgess_zheng/article/details/86762248
由于我是新手,为了便于自己理解面向对象,做了一些删改(主要是爱人的协助)
__author__ = "Burgess Zheng"
'''
simple Factory Method
'''
class Shape():
a = 1#父类属性
'''
父类;init可以没有,init用来初始化对象
比如想要个桌子,需用init来定义桌子的长度宽度高度来设置属性
创建对象的时候,需要对 对象进行初始化操作的时候,需要在类里面定义init方法
比如创建对象的时候,会传一些实参进去,这样就需要对 创建对象的类 定义init方法
比如形状就是个形状,没有附加的东西,调用的时候不会传入任何实参!所以不需要init
'''
def draw(self):
raise NotImplementedError
#这个语句里面定义的什么也没做,需要继承这个类的子类重写draw方法并实现
#含有这种raise NotImplementedError语句的方法的类,就是抽象类
class Circle(Shape):
'''
Shape子类,继承并且重写draw方法
'''
def draw(self):
print('draw circle')#重写父类draw方法,如果不重写就会
#引发父类的raise notinplemetedError错误
class Rectangle(Shape):
'''
Shape的子类,继承并且重写draw方法
'''
def draw(self):
print('draw Rectangle')
class ShapeFactory():#创建对象的接口
'''
工厂模式:暴露给用户去调用的,
用户可通过该类进行选择Shape的子类进行实例化
'''
def create(self, shape):#这个shape是个形参,不是属性!类似函数的形参
if shape == 'Circle':
return Circle()#返回一个对象
elif shape == 'Rectangle':
return Rectangle()
else:
return None
fac = ShapeFactory() #工厂类生成的对象,就是一个具体的工厂
#比如形状就是个形状,没有附加的东西,调用的时候不会传入任何实参!所以不需要init
obj = fac.create('Circle') #用'circle'返回一个Circle()类
for i in range(10):
a_circle = fac.create('Circle')
a_circle.draw()#批量生产产品:Circle;只需要指导抽象类有什么方法,子类肯定有这个方法。然后去调用
print(a_circle.a)#子类继承父类的属性并且自动继承
#然后调用circle这个子类的方法
#简单工厂方法:把生成对象的动作和对象自身属性等细节 解耦;
UML图如下: