创建型模式之工厂模式

举报
子都爱学习 发表于 2022/02/26 18:43:29 2022/02/26
【摘要】 工厂模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。意图定义一个接口来创建对象,但是工厂本身并不负责创建对象,而是将这一任务交给子类来完成,即子类决定了实例化那些类Factory方法的创建是通过继承而不是通过实例化来完成的工程方法使设计更具有可定制性。它可以返回相同的实例或子类,而不是某种类型的对象                            优点1、具有更大的灵活性,使...

工厂模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类。

意图

  • 定义一个接口来创建对象,但是工厂本身并不负责创建对象,而是将这一任务交给子类来完成,即子类决定了实例化那些类
  • Factory方法的创建是通过继承而不是通过实例化来完成的
  • 工程方法使设计更具有可定制性。它可以返回相同的实例或子类,而不是某种类型的对象

                           

优点

1、具有更大的灵活性,使代码更加透明通用
2、松耦合的:创建对象的代码与使用它的代码是分开的,客户端完全不需要关心传递哪些参数和实例化哪些类。
3、创建新类更容易,降低了维护的成本


实现

1.简单工厂

简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类。简单工厂实例化的类具有相同的接口或者基类,在子类比较固定并不需要扩展时,可以使用简单工厂。

from abc import ABC, abstractmethod

# 手机
class Phone(ABC):
    @abstractmethod
    def product(self):
        pass

# 苹果手机
class Apple(Phone):
    def product(self):
        print("product apple")

# 小米手机
class XiaoMi(Phone):
    def product(self):
        print("product xiaomi")

class Factory:
    def product_phone(self, mobile_type):
        if mobile_type == 'apple':
            return Apple()
        else:
            return XiaoMi()


if __name__ == '__main__':
    factory = Factory()
    factory.product_phone('apple').product()
    factory.product_phone('xiaomi').product()

简单工厂模式适用于需创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂的情况下,而且用户只关心那种类型的实例被创建,并不关心其初始化过程时,比如多种数据库(MySQL/MongoDB)的实例,多种格式文件的解析器(XML/JSON)等。但是一旦我们需要生产更多的产品,那我们就不得不去修改Factory。这样的话就违反了设计模式的“开放/封闭原则“

2.工厂方法模式

工厂模式包涵一个超类。这个超类提供一个抽象化的接口来创建一个特定类型的对象,而不是决定哪个对象可以被创建。

from abc import ABC, abstractmethod
# 抽象工厂
class AbastractFactory(ABC):
    @abstractmethod
    def product_phone(self):
        pass
# 苹果工厂
class AppleFactory(AbastractFactory):
    def product_phone(self):
        return Apple().product()
# 小米工厂
class XiaomiFactory(AbastractFactory):
    def product_phone(self):
        return XiaoMi().product()

# 生产线
class Phone(ABC):
    @abstractmethod
    def product(self):
        pass
# 苹果生产线
class Apple(Phone):
    def product(self):
        print("product apple")
# 小米生产线
class XiaoMi(Phone):
    def product(self):
        print("product xiaomi")

def client_product(factory: AbastractFactory):
    return factory

if __name__ == '__main__':
    xiaomi = client_product(XiaomiFactory())
    xiaomi.product_phone()
    apple = client_product(AppleFactory())
    apple.product_phone()

工厂方法模式继承了简单工厂模式的优点又有所改进,其不再通过一个工厂类来负责所有产品的创建,而是将具体创建工作交给相应的子类去做,这使得工厂方法模式可以允许系统能够更高效的扩展。实际应用中可以用来实现系统的日志系统等,比如具体的程序运行日志,网络日志,数据库日志等都可以用具体的工厂类来创建。工厂方法模式一个工厂子类只能生产一种产品。

3.抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类

from abc import ABC, abstractmethod
# 抽象工厂
class AbastractFactory(ABC):
    @abstractmethod
    def product(self):
        pass
# 苹果工厂
class AppleFactory(AbastractFactory):
    def __init__(self, name):
        self.name = name
    def product(self):
        if self.name == "Phone":
            return Apple_Phone().product()
        else:
            return Apple_PC().product()
# 小米工厂
class XiaomiFactory(AbastractFactory):
    def __init__(self, name):
        self.name = name
    def product(self):
        if self.name == "Phone":
            return XiaoMi_Phone().product()
        else:
            return XiaoMi_PC().product()

# 手机生产线
class Phone(ABC):
    @abstractmethod
    def product(self):
        pass
# 苹果手机生产线
class Apple_Phone(Phone):
    def product(self):
        print("product apple Phone")
# 小米手机生产线
class XiaoMi_Phone(Phone):
    def product(self):
        print("product xiaomi Phone")

# PC生产线
class PC(ABC):
    @abstractmethod
    def product(self):
        pass
# 苹果PC生产线
class Apple_PC(PC):
    def product(self):
        print("product apple PC")
# 小米生产线
class XiaoMi_PC(PC):
    def product(self):
        print("product xiaom PC")

def client_product(factory: AbastractFactory):
    return factory

if __name__ == '__main__':
    xiaomi = client_product(XiaomiFactory("Phone"))
    xiaomi.product()
    apple = client_product(AppleFactory("PC"))
    apple.product()

抽象工厂模式在工厂方法基础上扩展了工厂对多个产品创建的支持,更适合一些大型系统,比如系统中有多于一个的产品族,且这些产品族类的产品需实现同样的接口,像很多软件系统界面中不同主题下不同的按钮、文本框、字体等等。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。