简单工厂模式

源码地址:https://github.com/weilanhanf/PythonDesignPatterns

考虑动机:

考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、菱形按钮等),这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。

简单工厂模式基本实现流程:

具体产品类:将需要创建的各种不同产品对象的相关代码封装到具体产品类中

抽象产品类:将具体产品类公共的代码进行抽象和提取后封装在一个抽象产品类中

工厂类:提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入参数的不同创建不同的具体产品对象

客户端:只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象

说明:

简单工厂模式 (Simple Factory Pattern):定义一个工厂类,工厂类是整个模式的关键所在。它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。用户在使用的时候可以调用工厂类的CreatProduct()方法去创建所需的实例,而无需了解这些对象是如何创建以及组织的。在简单工厂模式中用于创建实例的方法通常是静态(static)方法,因此又被称为静态工厂方法(Static Factory Method)模式 要点:如果需要什么,只需要传入一个正确的参数,就可以获取所需要的对象,而无须知道其创建细节

简单工厂模式包含以下3个角色:

Factory(工厂角色) Product(抽象产品角色) ConcreteProduct(具体产品角色)

创建对象与使用对象:

将对象的创建与使用分离的其他好处 防止用来实例化一个类的数据和代码在多个类中到处都是,可以将有关创建的知识搬移到一个工厂类中,解决代码重复、创建蔓延的问题 构造函数的名字都与类名相同,从构造函数和参数列表中大家很难了解不同构造函数所构造的产品的差异  将对象的创建过程封装在工厂类中,可以提供一系列名字完全不同的工厂方法,每一个工厂方法对应一个构造函数,客户端可以以一种更加可读、易懂的方式来创建对象

模式优点

实现了对象创建和使用的分离 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性

模式缺点

工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响 增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度 系统扩展困难,一旦添加新产品不得不修改工厂逻辑 由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构,工厂类不能得到很好地扩展,也就是说简单工厂模式不符合六大设计模式原则之一的开放封闭原则。

模式适用环境

工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂 客户端只知道传入工厂类的参数,对于如何创建对象并不关心

原文地址:https://www.cnblogs.com/welan/p/9126216.html