目录
更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。
工厂模式是一种常用的设计模式,它用于创建对象,将对象的创建和使用分离开来,从而工厂模式能够降低应用维护的复杂度。客户端可以请求一个对象,而无需知道这个对象来自哪里,也就是无需知道使用哪个类来生成这个对象。在Python中,可以使用多种方式来实现工厂模式,包括简单工厂模式、工厂方法(Factory Method)模式和抽象工厂(Abstract Factory)模式。
本篇文章我将先为大家介绍下简单工厂模式的概念、作用、特点和使用方法,并提供了3个代码示例,在文章最后总结了简单工厂模式、工厂方法(Factory Method)模式和抽象工厂(Abstract Factory)模式之间的区别。后面的文章再介绍下工厂方法模式和抽象工厂模式。
原文:Python设计模式之创建型-简单工厂模式(Simple Factory)
在前面的文章《关于Python设计模式的一些事情,设计模式是否真能帮你解决什么问题?》中对Python的设计模式进行了一个大体的分享介绍。
【Python设计模式系列】
-
《Python设计模式之创建型-简单工厂模式(Simple Factory)》
-
《Python设计模式之创建型-工厂方法模式(Factory Method)》
-
《Python设计模式之创建型-抽象工厂模式(Abstract Factory)》
-
《Python设计模式之创建型-创建者(建造者)模式(Builder)》
-
《Python设计模式之创建型-原型模式(Prototype)》
-
《Python设计模式之创建型-对象池模式(Pool)》
-
《Python设计模式之创建型-惰性评价模式(Lazy Evaluation)》
-
《Python设计模式之结构型-代理模式(Proxy)》
-
《Python设计模式之结构型-适配器模式(Adapter)》
-
《Python设计模式之结构型-装饰器模式(Decorator)》
-
《Python设计模式之结构型-组合模式(Composite)》
-
《Python设计模式之结构型-外观模式(Facade)》
-
《Python设计模式之结构型-享元模式(Flyweight)》
-
《Python设计模式之结构型-桥接模式(Bridge)》
-
《Python设计模式之结构型-3层模式(3-tier)》
-
《Python设计模式之结构型-前端控制器模式(front controller)》
-
《Python设计模式之结构型-MVC模式(mvc)》
-
《Python设计模式之行为型-观察者模式(Observer)》
-
《Python设计模式之行为型-模板方法(Template Method)模式》
-
《Python设计模式之行为型-策略模式(Strategy)》
-
《Python设计模式之行为型-职责链模式(Chain of Responsibility)》
-
《Python设计模式之行为型-状态模式(State)》
-
《Python设计模式之行为型-迭代器模式(Iterator)》
-
《Python设计模式之行为型-访问者(访客)模式(Visitor)》
-
《Python设计模式之行为型-命令模式(Command)》
-
《Python设计模式之行为型-解释器模式(Interpreter)》
-
《Python设计模式之行为型-调停者(中介者)模式(Mediator)》
-
《Python设计模式之行为型-备忘录模式(Memento)》
-
《Python设计模式之行为型-目录模式(catalog)》
-
《Python设计模式之行为型-方法链模式(chaining method)》
-
《Python设计模式之行为型-发布订阅模式(publish subscribe)》
-
《Python设计模式之行为型-注册模式(registry)》
-
《Python设计模式之行为型-规格模式(specification)》
简单工厂模式是一种创建型设计模式,创建型设计模式处理对象创建相关的问题,目标是当直接创建对象(在Python中是通过__init__()函数实现的)不太方便时,提供更好的方式。简单工厂模式通过一个工厂类来创建对象。工厂类根据传入的参数来决定创建哪种类型的对象,并返回该对象的实例。简单工厂模式将对象的创建和使用分离开来,客户端只需要知道工厂类和对象的接口,而不需要知道具体的对象实现。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
作用
通过一个工厂类创建不同的产品对象,将产品的创建逻辑封装在工厂类中。
适用场景
简单工厂模式的适用场景:
-
当需要创建多个相似的对象时,可以使用简单工厂模式来统一管理和创建对象。
-
当一个类希望由它的子类来指定它所创建的对象的时候,或者当类将创建对象的职责委托给多个子类中的某一个。
示例代码
下面是一个简单工厂模式的示例代码:
import settings
class Product:
def __init__(self):
print(f"{settings.AUTHOR}")
def do_something(self):
print("product")
class ConcreteProductA(Product):
def __init__(self):
super().__init__()
def do_something(self):
print(f"look at {settings.BLOG}")
class ConcreteProductB(Product):
def __init__(self):
super().__init__()
def do_something(self):
print(f"look at {settings.CSDN}")
class SimpleFactory:
@staticmethod
def create_product(product_type):
if product_type == "A":
return ConcreteProductA()
elif product_type == "B":
return ConcreteProductB()
else:
raise ValueError("Invalid product type")
if __name__ == '__main__':
# 使用简单工厂模式创建对象
product_a = SimpleFactory.create_product("A")
product_a.do_something()
product_b = SimpleFactory.create_product("B")
product_b.do_something()
在上面的示例中,我们定义了一个抽象产品类Product,它定义了产品的接口。然后我们定义了两个具体产品类ConcreteProductA和ConcreteProductB,它们分别实现了抽象产品类的接口。最后,我们定义了一个简单工厂类SimpleFactory,它根据传入的参数决定创建哪种类型的产品,并返回该产品的实例。
更多关于设计模式的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。
示例代码2
工厂模式是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。在Python中,可以使用类方法或静态方法来实现工厂模式。
import settings
# 使用类方法实现工厂模式
class Product:
def get_name(self):
print(f"{settings.AUTHOR}")
class ConcreteProductA(Product):
def get_name(self):
print(f"look at {settings.BLOG}")
class ConcreteProductB(Product):
def get_name(self):
print(f"look at {settings.CSDN}")
class Factory:
@classmethod
def create_product(cls):
pass
class ConcreteFactoryA(Factory):
@classmethod
def create_product(cls):
return ConcreteProductA()
class ConcreteFactoryB(Factory):
@classmethod
def create_product(cls):
return ConcreteProductB()
if __name__ == '__main__':
ConcreteFactoryA.create_product().get_name() # look at https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q
ConcreteFactoryB.create_product().get_name() # look at https://blog.csdn.net/zhouruifu2015/
示例代码3
import settings
class Factory:
def look(self):
raise NotImplementedError
class LookCSDN(Factory):
def look(self):
print(f"look at {settings.CSDN}")
class LookWeChat(Factory):
def look(self):
print(f"look at {settings.BLOG}")
class LookFactory:
"""
工厂模式:暴露给用户去调用的,用户可通过该类进行选择Look的子类进行实例化
"""
@staticmethod
def look_at(addr):
if addr == 'csdn':
return LookCSDN()
elif addr == 'wechat':
return LookWeChat()
if __name__ == '__main__':
# 先实例化工厂类 然后 实例化子类 最后调用工厂方法
LookFactory.look_at('csdn').look() # look at https://blog.csdn.net/zhouruifu2015/
LookFactory.look_at('wechat').look() # look at https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q
上面的代码定义了一个Factory类(基类),用于提取出所有子类重复的方法代码,随后定义了两个子类LookCSDN(Factory派生类)用于阅读CSDN博客,子类LookWeChat(Factory派生类)用于获取公众号的文章。LookFactory作为一个新式类,该类的作用是为用户可根据该类对象创建指定的Factory子类对象(LookCSDN或LookWeChat)。
简单工厂模式的优缺点
使用简单工厂模式的优点是将对象的创建和使用分离开来,客户端只需要知道工厂类和产品的接口,而不需要知道具体的产品实现(客户端不需要修改代码)。这样可以降低客户端和具体产品类之间的耦合度。然而,简单工厂模式的缺点是每次当需要新增一个产品类都需要修改工厂类的代码,违反了开闭原则。
更多关于设计模式的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。
抽象工厂、工厂方法、简单工厂之间的区别
最后介绍下抽象工厂、工厂方法、简单工厂这几种工厂方法的区别
首先,抽象工厂模式(Abstract Factory)、工厂方法模式(Factory Method)和简单工厂模式(Simple Factory)都属于创建型设计模式,它们都用于创建对象,但在实现方式和应用场景上有一些区别。
1. 简单工厂模式(Simple Factory)
简单工厂模式通过一个工厂类来创建对象,根据传入的参数或条件决定创建哪种具体对象。
简单工厂模式的优点是可以隐藏对象的创建逻辑,客户端只需要通过工厂类来获取对象即可,不需要关心具体的创建细节。
简单工厂模式的缺点是当需要添加新的具体对象时,需要修改工厂类的代码,违反了开闭原则。
2. 工厂方法模式(Factory Method)
工厂方法模式将对象的创建延迟到子类中实现,每个具体子类都可以创建自己特定的对象。
工厂方法模式通过定义一个抽象的工厂接口和多个具体的工厂子类来实现对象的创建。
工厂方法模式的优点是符合开闭原则,可以通过添加新的具体工厂子类来扩展对象的创建。
工厂方法模式的缺点是客户端需要知道具体的工厂子类,增加了客户端与工厂子类的耦合。
3. 抽象工厂模式(Abstract Factory)
抽象工厂模式通过定义一个抽象的工厂接口和多个具体的工厂类来创建一系列相关或相互依赖的对象。
抽象工厂模式可以创建一组相关的产品对象,而不需要指定具体的工厂子类。
抽象工厂模式的优点是将对象的创建和使用解耦,客户端只需要通过抽象工厂接口来创建对象,不需要关心具体的工厂类和产品类。
抽象工厂模式的缺点是当需要添加新的产品对象时,需要修改抽象工厂接口和所有的具体工厂类,违反了开闭原则。
综上所述,简单工厂模式适用于对象的创建逻辑相对简单,不需要频繁添加新的具体对象;工厂方法模式适用于对象的创建逻辑复杂,需要根据不同的条件创建不同的对象;抽象工厂模式适用于创建一组相关的产品对象,需要将对象的创建和使用解耦。
下一篇我们将介绍下工厂方法模式《Python设计模式之创建型-工厂方法模式(Factory Method)》。
Python专栏
https://blog.csdn.net/zhouruifu2015/category_5742543
更多精彩,关注我公号,一起学习、成长
CTO Plus
一个有深度和广度的技术圈,技术总结、分享与交流,我们一起学习。 涉及网络安全、C/C++、Python、Go、大前端、云原生、SRE、SDL、DevSecOps、数据库、中间件、FPGA、架构设计等大厂技术。 每天早上8点10分准时发文。
306篇原创内容
公众号
标准库系列-推荐阅读:
原文:Python设计模式之创建型-简单工厂模式(Simple Factory)
推荐阅读:
最后,不少粉丝后台留言问加技术交流群,之前也一直没弄,所以为满足粉丝需求,现建立了一个关于Python相关的技术交流群,加群验证方式必须为本公众号的粉丝,群号如下: