工厂方法模式的练习
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。
首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式的对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),
这个类将不在负责具体的产品生产,
而是只制定一些规范,具体的生产工作由其子类去完成。
在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品
,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
工厂方法模式(Factory Method pattern)是最典型的模板方法模式(Templete Method pattern)应用。
需求
”’
1. 使用工厂模式编写代码。
要求:
1.有一个基类Person ,包涵获取名字,性别的方法 。
有两个子类Male 和Female,可以打招呼。还有一个工厂类。
2.工厂类有一个方法名getPerson有两个输入参数,名字和性别。
3.用户使用工厂类,通过调用getPerson方法传递姓名、性别给工厂,工厂创建一个相应的对象。
”’
思想:
1,创建一个抽象的工厂类 里面只定义方法 不实现 交由子类去实现 创建的方法
一般有一个创建产品的类是实现的 然会的是是一个调用自己抽象方法的调用
2,创建两个具体的工厂类 子类实现抽象工厂中的 抽象方法
3,创建一个抽象的创建产品类 里面只定义方法不实现 交由子类去实现
一般有一个创建产品的类是实现的 然会的是是一个调用自己抽象方法的调用
4,创建两个具体的创建产品类 子类实现抽象抽象的产品中的 抽象方法
然后就是具体的产品基类和具体的产品类了
”’
代码演示:
class Person:
def __init__(self, name, sex):
self.name = name
self.sex = sex
# 获取名字的方法
def getName(self):
return self.name
# 获取性别的方法
def getSex(self):
return self.sex
# 两个子类
class Male(Person):
# 从父类继承了 两个属性 在创建的时候需要传递 传递参数
def say_hello(self):
print("hello,i am male")
def __str__(self):
return "生产的人类的名字%s,性别%s" % (self.name, self.sex)
class Female(Person):
# 从父类继承了 两个属性 在创建的时候需要传递 传递参数
def say_hello(self):
print("hello,i am female")
def __str__(self):
return "生产的人类的名字%s,性别%s" % (self.name, self.sex)
# 一个抽象的工厂类
class Factory():
# 让子工厂来选择具体要创建的人
def select_person(self, name, sex):
pass
# 自己实现方法 调用选择的人呢 让子类进行继继承
def getPerson(self, name, sex):
return self.select_person(name, sex)
# 在创建两个具体生产产品的子工厂 继承抽象工厂
class MaleFactory(Factory):
# 里面有一个从父类继承来的getPerson 方法 直接调用这个工厂的对应的工厂就可以了
def select_person(self, name, sex):
if sex == "male":
return Male(name, sex) # 直接进行返回 不在最后返回 避免出错
else:
return None
# 从父类中进行继承的 不用自己实现
# def getPerson(self, name, sex):
# return self.select_factory(name, sex)
class FemaleFactory(Factory):
def select_person(self, name, sex):
if sex == "female":
return Female(name, sex) # 返回一个女性
else:
return None
# 用户的抽象基类 然后在派生出来两个子类
class User:
# 写一个空的方法交个子类去实现
def select_factory(self, name, sex):
pass
# 实现创建人的方法 让子类去继承
def creat_person(self, name, sex):
return self.select_factory(name, sex)
# 创建女性的用户
class UserFemale(User):
# 子类实现父类的空方法
def select_factory(self, name, sex):
return FemaleFactory().getPerson(name, sex)
# 创建男性的用户
class UserMale(User):
# 子类实现父类的空方法
def select_factory(self, name, sex):
return MaleFactory().getPerson(name, sex)
# 从父类中继承 不用自己在写
# def creat_person(self, name, sex):
# return self.select_factory(name, sex)
# 创建男性的用户
user_male = UserMale()
# 创建女性的用户
user_female = UserFemale()
# 创建 男性
person_male = user_male.creat_person("小强", "male")
print(person_male)
person_male.say_hello()
# 创建女性
person_female = user_female.creat_person("小红", "female")
print(person_female)
person_female.say_hello()
# 创建男性
person_male2 = user_male.creat_person("小米", "male")
print(person_male2)
person_male2.say_hello()
运行结果:
生产的人类的名字小强,性别male
hello,i am male
生产的人类的名字小红,性别female
hello,i am female
生产的人类的名字小米,性别male
hello,i am male