岳阳做网站,东华建设官方网站,深圳电商网站建设公司,福建省住房和建设厅网站一、概念
工厂方法模式#xff08;Factory Method#xff09;#xff0c;定义一个用于创建对象的接口#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。从而使得系统更加灵活。客户端可以通过调用工厂方法来创建所需的产品#xff0c;而不必…一、概念
工厂方法模式Factory Method定义一个用于创建对象的接口让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。从而使得系统更加灵活。客户端可以通过调用工厂方法来创建所需的产品而不必关心具体的实现细节。这种模式符合开放-封闭原则对扩展开放、对修改关闭。
二、与简单工厂模式的区别
特点简单工厂工厂方法模式定义由一个工厂类负责创建所有产品对象。定义一个用于创建对象的接口让子类决定实例化哪一个类。角色数量只有一个工厂类可能会有多个产品类。有多个具体工厂类每个具体工厂负责创建一种产品。扩展性添加新产品时需要修改简单工厂类违反开闭原则。添加新产品只需增加新的具体工厂和产品类不需要修改现有代码。客户端代码客户端直接依赖于简单工厂类通常需要知道具体的产品类型。客户端只依赖于抽象工厂类不需要知道具体的工厂实现。复杂度实现较为简单适合产品较少的情况。实现较为复杂但适合需要扩展的系统。
如图我们在简单工厂模式中计算器的例子如果我在新增一个计算方法√、或者平方、立方那么我将直接改造工厂类如果新增的许多计算方法那么我们简单工厂中将会有大量的代码逻辑这违反了开闭原则的。 在比如我们想买一辆比亚迪电车最初比亚迪比较小只有一个工厂我们所有的车都在这个工厂里制造没问题可随着比亚迪的发展越来越牛逼不仅有低端车更是有几百万的高端车这时候一个工厂远远满足不了产能的需求而且如果这个工厂gg了所有的车都制造不出来了这是不被允许的于是领导小手一拍建立了多个不同车型的制造工厂比如王朝系列海洋系列工厂分别制造不同的车型这就是从简单工厂模式-工厂方法模式的进阶。
优点
遵循开闭原则可以通过添加新的具体工厂和产品类来扩展产品而无需修改现有代码增强了系统的可扩展性。提高代码灵活性客户端只依赖于抽象工厂接口具体产品的创建逻辑在子类中实现客户端无需了解具体实现。封装对象创建将对象的创建过程封装在工厂子类中客户端代码更加简洁关注于使用而不是创建。减少耦合将产品的实例化与使用分离不需要知道每个具体产品的类名降低了系统的耦合度。
缺点
增加代码复杂性引入多个工厂和产品类代码结构较为复杂对于简单需求可能显得过于臃肿。类数量增多每增加一种新产品都需要相应地增加一个具体工厂类这可能导致系统中类的数量增加管理起来较为繁琐。学习成本对于不熟悉设计模式的开发者来说理解和正确应用工厂方法模式需要一定时间和经验。
三、适用场景
当一个类不知道它所必须创建的对象的类时。 当一个类希望由其子类来指定生成对象时。 当将创建对象的职责委托给多个帮助子类中的某一个并希望将哪一个子类是代理者这一信息局部化时。 通过合理使用工厂方法模式可以提升系统的灵活性和可维护性但需要权衡其复杂性和实际需求。
四、实例分析
接着上述计算器的例子我们继续优化。 对于加减乘除这种很基础的操作我们可以单独封装为基础运算操作类对于根号运算幂等运算可以定义为高级运算操作类这样无论我添加多少额外的运算方法都不会影响基础的运算。
先定义一个用于创建对象的接口定义了一个创建 Operation对象的方法 createOperation()。这个方法没有具体的实现而是留给子类来决定如何创建具体的对象。 增加两个高级运算类 指数运算、对数运算。 具体工厂类 FactoryBasic 和 FactoryAdvanced 继承自 IFactory并实现了 createOperation() 方法。在这些子类中具体的实例化逻辑被定义为返回对应运算方法的运算对象。 对比与简单工厂方法中的OperationFactory新的OperationFactory类已经不存在运算子类实例化的 代码了。也就是说在这个代码里全部是接口与具体工厂类并不存在具体的实现与原来的OperationFactory类对比实例化的过程延迟到了工厂子类中。