工厂方法模式的练习

工厂方法模式的练习

工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。
首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。   
工厂方法模式的对简单工厂模式进行了抽象。有一个抽象的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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值