首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python 实现动态的工厂模式

前言 本文讨论的主要是,如何把工厂模式生产的产品,即抽象类的子类信息动态地保存到一个表中,而不是直接简单粗暴地使用 if-else 来判断。...那么本文所使用的示例来自于我一个分析 QQ 聊天记录文件的项目,因为它对于群聊的聊天记录和私聊的聊天记录格式不同,需要分别处理,所以就到了本文所讨论的工厂模式。...装饰器 这里不是介绍装饰器,只是通过装饰器的形式来保存子类信息。我这里省略了 Parser 中的其它方法,只保留抽象方法。...具体的分析如下:首先,元类的本质是默认创建类的时候会调用 type,而指定元类后就调用指定的那个类。...哈哈,其实没这么简单,大家可以参考维基百科给出的解释,就是 Spring 那一套,只不过注入的时候需要手动指定。 本文中给的情景就是一个很好的解释依赖注入的例子。

40420

简单工厂模式

扩展性较弱:如果需要增加新产品,需要修改工厂类代码,违反开闭原则。 适用场景 客户端需要创建不同种类的对象,但不需要关心具体的实现。 需要对实例化的过程进行控制或封装。...缺点 扩展性差: 每增加一种新产品,都需要修改工厂类的代码。 违反开闭原则(Open/Closed Principle)。...如何增强简单工厂模式 结合单例模式:将工厂类设计为单例,避免频繁创建工厂实例。...factory() : null; } 动态加载类(反射):在需要动态扩展产品时,工厂类可以使用反射加载产品类型: public Product CreateProduct(string type) {...避免逻辑臃肿:工厂类的逻辑要简洁,复杂的创建逻辑可以委托给专门的创建类处理。 性能考虑:动态加载或反射可能影响性能,在高性能场景中需谨慎使用。

5310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    工厂方法到抽象工厂模式

    当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背“开闭原则”,如何实现增加新产品而不影响已有代码?...简单工厂模式最大的缺点是当有新产品要加入到系统中时,必须修改工厂类,需要在其中加入必要的业务逻辑,这违背了“开闭原则”。...基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。...这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。...工厂方法模式比起简单工厂模式更加符合开闭原则。

    8410

    Python设计模式(2):工厂方法模式

    在简单工厂模式类中,工厂方法是静态(Static)的,而在工厂模式中工厂方法是动态的(Dynamic)。 简单工厂模式不支持开闭原则,工厂方法模式支持开闭原则。...在简单工厂模式中,如果要增加一个新的产品类,相应地在工厂类中也要增加一个条件语句,用于创建一个新的产品类对象。也就是说,必须修改工厂类的源代码。因此简单工厂模式不支持开闭原则。...在工厂方法模式中,增加新产品,只需在Product类的结构体中增加一个实类,并且在工厂类的层次结构体中增加一个增加一个相应的能产生该新产品类对象的实类。...因此工厂方法模式支持开闭原则。 在简单工厂模式中,必要的创建对象的逻辑判断包含在工厂类中;在工厂方法模式中,工厂类不必包含创建对象的逻辑判断。 在以下任何一种情况下,可以使用工厂方法模式。...需要封装创建类的对象的逻辑,使得这些逻辑局部化。 工厂方法模式的优点如下: 工厂方法模式将创建对象的逻辑与任务交给了工厂类。 工厂方法模式支持开闭原则。

    61720

    设计模式之工厂模式!深入解析简单工厂模式,工厂方法模式和抽象工厂模式

    具体工厂类ConcreteFactory都具有同一父类接口Factory, 因此工厂方法模式又称为多态工厂模式 工厂方法模式完全符合开闭原则,有利于系统的扩展和维护....,通过子类对象覆盖父类对象,从而使得系统得以扩展 通过将创建具体产品的任务交由工厂类的具体工厂实现来完成,客户端不需要关心具体产品类的创建, 需要的时候动态指定产品的具体工厂实现即可....,符合开闭原则 对客户端隐藏了具体实现,客户端只需要关心具体的工厂实现即可 缺点: 每次增加一个产品,都需要增加一个具体工厂实现类和具体产品类,这样使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度...系统中提供一个产品类的库,客户端不依赖具体产品的实现,所有产品以同样的接口出现 系统结构稳定,不会频繁增加产品族 抽象工厂模式问题: 开闭原则的倾斜性 抽象工厂模式中开闭原则的倾斜性是指在抽象工厂模式中...,不需要修改已有的代码 增加产品族: 对于增加新的产品族的产品等级结构,需要修改所有的工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加生产新产品族产品的方法,这是违背了开闭原则的 因为抽象工厂模式存在开闭原则的倾斜性

    42920

    设计模式的征途—3.工厂方法(Factory Method)模式

    上一篇的简单工厂模式虽然简单,但是存在一个很严重的问题:当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背开闭原则。...如何实现新增新产品而不影响已有代码?工厂方法模式为此应运而生。...(2)系统扩展不灵活,如果新增类型的日志记录器,必须修改静态工厂方法的业务逻辑,违反了开闭原则。   如何解决这两个问题,M公司程序猿苦思冥想,想要改进简单工厂模式,于是开始学习工厂方法模式。...其最大的缺点就是当有新产品加入时,必须修改工厂类,需要在其中加入必要的业务逻辑,这违背了开闭原则。...因此,系统的可扩展性得到了保证,符合开闭原则。 5.2 主要缺点 在添加新产品时,需要编写新的具体产品类,还要提供与之对应的具体工厂类,系统中类的个数将成对增加,一定程度上增加了系统的复杂度。

    59320

    Java设计模式-工厂模式(1)简单工厂模式

    简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。...后期如果再加新品种的咖啡,我们势必要需求修改SimpleCoffeeFactory的代码,违反了开闭原则。...把对象的创建和业务逻辑层分开,这样以后就避免了修改客户代码,如果要实现新产品直接修改工厂类,而不需要在原代码中修改,这样就降低了客户代码修改的可能性,更加容易扩展。...“开闭原则”。...这种方式用的也很多,常见也很简单。 三、结语 这个简单工厂并不完善,增加新产品时还是需要修改工厂类的代码,违背了“开闭原则”,所以才有了后文的工厂模式、抽象工厂模式。 持续更新中哦。

    28020

    一起学习设计模式--03.工厂方法模式

    简单工厂模式虽然简单,但是存在一个很严重的问题:由于静态工厂方法是根据传入的参数不同来创建不同的产品的,所以当系统中需要引入新产品时,就需要修改工厂类的源代码,这将违背开闭原则。...为了实现增加新产品而不修改原有代码,工厂方法模式应运而生。...系统的扩展不灵活,如果要增加新的日志记录器,必须修改静态工厂方法的业务逻辑,违反了开闭原则。 工厂方法模式的动机之一就是为了解决以上两个问题。...简单工厂最大的缺点就是每当有新的产品要加入系统的时候,就必须修改工厂类,在静态工厂方法中添加新产品的业务逻辑,这就违反了开闭原则。...,就需要修改客户端的具体日志记录器工厂类的创建,这一点上来说违背了开闭原则。

    44220

    【设计模式】工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    6、实现工厂类 2 7、测试类 五、扩展上述工厂方法模式 1、扩展的产品实现类 2、扩展的工厂实现类 3、测试类 一、工厂方法模式简介 ---- 工厂方法模式 : 定义一个 创建对象 的 接口 , 让...工厂子类 创建的 产品对象 ; 工厂子类 一般都是 需要的时候 , 动态指定 ; 三、工厂方法模式优缺点 ---- 工厂方法模式优点 : 不关心创建细节 : 用户 只需要 关心 所需产品 对应的工厂..., 无需关心创建细节 ; 符合开闭原则 : 加入 新产品 , 符合开闭原则 , 提高可扩展性 ; 工厂方法模式 中 , 使用 工厂类创建 产品对象 , 同时 隐藏了 具体的 产品类 被 实例化 的细节...; 工厂方法模式缺点 : 增加复杂性 : 类的个数容易过多 , 增加系统复杂度 ; 在 添加新产品 时 , 除了编写 新的产品类 之外 , 还要 编写该产品类对应的 工厂类 ; 增加难度 : 增加了系统...抽象性 和 理解难度 ; 工厂方法本身 利用了抽象 , 该模式中会 引入抽象层 , 如果要动态创建产品类 , 还要 引入反射技术 ; 设计模式 的 使用 , 要根据 实际的 业务场景 , 模型 综合平衡考量

    46920

    设计模式---工厂模式

    系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护,且违背开闭原则。...,并克服了它的缺点 核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给其子类去完成 可以允许系统在不修改工厂角色的情况下引进新产品 增加具体产品–>增加具体工厂,符合“开闭原则” ----...; ---- 模式扩展 “开闭原则”的倾斜性 “开闭原则”要求系统对扩展开放,对修改封闭,通过扩展达到增强其功能的目的。...(2) 增加新的产品等级结构:对于增加新的产品等级结构,需要修改所有的工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加生产新产品的方法,不能很好地支持“开闭原则”。...抽象工厂模式的这种性质称为“开闭原则”的倾斜性,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,但不能为新的产品等级结构的增加提供这样的方便。

    35610

    Java面向对象设计之工厂方法模式

    这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。 1....基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。...这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。 2....其缺点是工厂类的扩展比较困难,不符合“开闭原则”,但它仍然是一个非常实用的设计模式。 2....这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

    50410

    【设计模式 05】工厂方法

    工厂方法模式 define an interface or abstract class for creating an object but let the subclasses decide which...,客户端只需要给简单工厂一个“类的标志”,工厂类就能动态返回一个实例化对象,这样的好处是简化了客户端操作,从客户端按说,符合开闭原则,但每次添加新的产品,都需要修改工厂类,添加新的判断逻辑,不符合开闭原则...为了解决简单工厂的这个问题,工厂方法中会先定义一个创建对象的接口或抽象类,然后让子类去决定实例化哪个类。 工厂方法的优点 客户端只需要知道产品对应的接口即可,无需关心产品的具体实现细节。...比简单工厂有更好的可拓展性,添加新产品只需要实现接口即可。 耦合度进一步下降。...{ BasePhone createPhone(); } 具体的工厂实现类中实例化产品: public class HonorFactory implements IPhoneFactory

    14910

    《跟二师兄学Nacos吧》EXT-02篇 面试官问工厂模式,你理解的对吗?

    学习不用那么功利,二师兄带你一起轻松读源码~ 在上篇文章中,我们学习了Nacos中是如何灵活运用《简单工厂模式》的。而设计模式在面试过程中也经常会出现。当面试官问到:说说工厂模式是如何实现的?...在讲简单工厂模式时,已经知道该模式存在一些缺点,比如工厂类业务逻辑过于复杂,违背了开闭原则和高内聚低耦合的原则。同时,还由于方法是静态的,还无法形成继承的层级结构。...工厂方法模式的优缺点 工厂方法模式对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。...优点: 客户端只需知道具体工厂就可得到所要的产品,无须知道产品的具体创建过程; 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类; 符合开闭原则、符合单一职责原则、解决类简单工厂模式无法继承等级结构问题...缺点: 类数量增多,新增新产品时还需要新增对应的工厂实现类; 增加了系统的抽象性和理解难度; 抽象产品只能生产一种产品,如果换一个产品的话,还是需要修改产品类的。此弊端可使用抽象工厂模式解决。

    18710

    工厂方法模式

    简单工厂模式加产品,需要修改内部判断逻辑,这是违反设计模式六大模式中的开闭原则,就是对扩展是开放的,对修改是关闭的。...工厂方法模式加产品,只需增加相对应的具体工厂对象即可,符合开闭原则,这是工厂方法模式优点之一。个人观点:工厂方法模式适合那种经常更替(即增加和删除)具体产品对象的场景,正好利用了这个优点。...2、基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。...3、使用工厂方法模式的另一个优点是在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。...这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。

    22620

    工厂方法模式

    通过这种方式,工厂方法模式将对象的实例化推迟到子类。 特点 解耦性:客户端通过工厂方法创建对象,而无需关心具体的类名。 扩展性:可以通过新增具体工厂类来扩展新产品类型,符合开闭原则。...灵活性:支持产品族的扩展。 使用场景 当具体类的创建复杂时:需要将创建逻辑封装到子类中。 客户代码需要依赖抽象类或接口:而不是具体实现。 产品种类经常变化:需要动态扩展新的产品类。...工厂方法模式的结构 工厂方法模式由以下几个部分组成: 抽象产品(Product):定义产品的接口。 具体产品(ConcreteProduct):实现产品接口。...与依赖注入结合:通过 DI 容器动态注入具体工厂,简化复杂产品族的管理。 总结 工厂方法模式提供了更高的扩展性和灵活性,适合复杂或动态变化的产品族。...它的实现复杂度较高,不适合产品种类固定或单一的场景。 在实际项目中,工厂方法模式常与依赖注入、简单工厂、抽象工厂模式结合使用,以实现更加灵活的设计架构。 欢迎关注、点赞、收藏!

    5800

    Kotlin 设计模式及实战 (持续更新中......)

    设计原则和模式 六大设计原则 1、开闭原则(Open Close Principle) 开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。...实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。...简单工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。...这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。...违反了依赖倒置原则。访问者模式依赖了具体类,而没有依赖抽象类。 模式的结构与实现 访问者(Visitor)模式实现的关键是如何将作用于元素的操作分离出来封装成独立的类,其基本结构与实现方法如下。

    1.3K20

    抽象工厂模式

    抽象工厂模式概述 2. 抽象工厂模式的结构与实现 3. 抽象工厂模式的应用实例 4. 抽象工厂模式的应用实例 5. 开闭原则的倾斜性 6....抽象工厂模式的结构与实现 典型的抽象工厂类代码: public interface AbstractFactory { public AbstractProductA createProductA...开闭原则的倾斜性 增加产品族 对于增加新的产品族,抽象工厂模式很好地支持了开闭原则,只需要增加具体产品并对应增加一个新的具体工厂,对已有代码无须做任何修改 增加新的产品等级结构 对于增加新的产品等级结构...,需要修改所有的工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加生产新产品的方法,违背了开闭原则 6....,无须修改已有系统,符合开闭原则 模式缺点 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了开闭原则 模式适用环境 一个系统不应当依赖于产品类实例如何被创建

    45040

    02.工厂模式设计思想

    新增需求1: 后期我想要再增加一个或者多个新的咖啡,简单工厂这个案例则需要修改工厂角色,这个违背了开闭原则。那有什么好的方式解决呢?可以用工厂方法模式。工厂方法实现:Product:抽象产品。...; } return coffee; }}尽管简单工厂模式的代码实现中,有多处 if 分支判断逻辑,违背开闭原则,但权衡扩展性和可读性,这样的代码实现在大多数情况下(比如...简单工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。...,更加符合“开闭原则”。...这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。

    10010

    初识设计模式

    * * 优点:从它的实现中我们可以看到,这种方式的实现比较简单,在类加载的时候就完成了实例化,避免了线程的同步问题。...懒汉式加载是在使用时才会去new 实例的,那么你去new的时候是一个动态的过程,是放到方法中实现的,比如: public static synchronized Singleton getInstance...但缺点在于不符合“开闭原则”,每次添加新产品就需要修改工厂类。...每 实现工厂类,由具体工厂类决定要实例化的产品是哪个,将对象的创建与实例化延迟到子类,这样工厂的设计就符合“开闭原则”了,扩展时不必去修改原来的代码。...● 智能化 这在我们以上的讲解中还没有体现出来,不过在我们以下的动态代理章节中你就会看到 代理的智能化有兴趣的读者也可以看看Struts是如何把表单元素映射到对象上的 AOP框架时,弄清楚几个名词就成:

    19130

    【设计模式 11】抽象工厂模式

    ,但每次添加新的产品都要修改工厂类,违反开闭原则,后来工厂方法将工厂类向上抽象出一个“抽象工厂接口”,让每一个具体的工厂类只返回一种产品,这样添加新产品时只需要给“抽象工厂接口”添加新的实现类即可,但工厂方法的问题在于每个具体工厂只能生产一种产品...但简单工厂“从工厂内看”不符合开闭原则,如果要新添加一个数据库(新添加一种变体)如Oricle, 使用工厂方法时只需要添加一个抽象工厂接口的实现类(满足开闭原则),现在需要修改DaoFactory(不符合开闭原则...另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。...这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。...开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)。

    29530
    领券