内部购物券网站怎么做,做网站如何计算工资,做目录的网站,化妆品网站主页设计工厂方法模式就是定义一个用于创建对象的接口#xff0c;让子类决定实例化哪一个类。工厂方法模式将类的实例化#xff08;具体产品的创建#xff09;延迟到工厂类的子类#xff08;具体工厂#xff09;中完成#xff0c;即由子工厂类来决定该实例化哪一个类。
Define a…工厂方法模式就是定义一个用于创建对象的接口让子类决定实例化哪一个类。工厂方法模式将类的实例化具体产品的创建延迟到工厂类的子类具体工厂中完成即由子工厂类来决定该实例化哪一个类。
Define an interface for creating an object, but let subclasses decide which class to instantiate.
The Factory method lets a class defer instantiation it uses to subclasses. 结构设计
工厂方法模式包含如下角色 Product抽象产品用来定义工厂方法所创建的对象的接口。 ConcreteProduct具体产品用来实现Product的接口。 Factory抽象工厂负责声明工厂方法该方法返回一个Product类型的对象。 ConcreteFactory具体工厂用来实现Factory声明的工厂方法。 工厂方法模式类图表示如下
伪代码实现
接下来将使用代码介绍下工厂方法模式的实现。
// 1、定义产品(Product)抽象类(也可以是基类)对产品接口进行声明
public abstract class Product {abstract void function();
}
// 2、定义具体产品(Concrete Products)产品接口的不同实现
public class ConcreteProductA extends Product {Overridepublic void function() {System.out.println(---------do some thing in a ConcreteProductA instance---------);}
}
public class ConcreteProductB extends Product {Overridepublic void function() {System.out.println(---------do some thing in a ConcreteProductB instance---------);}
}
// 3、产品工厂(Product Factory)抽象类或基类声明返回产品对象的工厂方法。该方法的返回对象类型必须与产品接口相匹配。
// 可以将工厂方法声明为抽象方法强制要求每个子类以不同方式实现该方法。或者在基础工厂方法中返回默认产品类型。
// 注意该类最主要的职责并不是创建产品。 一般来说 产品工厂类包含一些与产品相关的核心业务逻辑。工厂方法将这些逻辑处理从具体产品类中分离出来。
public abstract class ProductFactory {/*** 生产产品*/abstract Product create();
}
// 4、具体产品工厂(Concrete Product Factories)重写基础工厂方法 使其返回不同类型的产品。
// 注意 并不一定每次调用工厂方法都会创建新的实例。工厂方法也可以返回缓存、对象池或其他来源的已有对象。
public class ProductFactoryA extends ProductFactory {Overridepublic Product create() {System.out.println(create ProductA);return new ConcreteProductA();}
}
public class ProductFactoryB extends ProductFactory {Overridepublic Product create() {System.out.println(create ProductB);return new ConcreteProductB();}
}
// 5、客户端调用
public class FactoryMethodClient {public void foo() {// (1) 实例化产品工厂ProductFactory productFactoryA new ProductFactoryA();// (2) 生产产品Product productA productFactoryA.create();// (3) 使用产品productA.function();ProductFactory productFactoryB new ProductFactoryB();Product productB productFactoryB.create();productB.function();}
}适用场景
在以下情况下可以考虑使用工厂方法模式 (1) 如果无法预知对象确切类别及其依赖关系时可使用工厂方法。 工厂方法将创建产品的代码与实际使用产品的代码分离从而能在不影响其他代码的情况下扩展产品创建部分代码。 例如如果需要添加一种新产品则只需要开发新的产品工厂子类然后重写其工厂方法即可。 (2) 如果希望用户能扩展软件库或框架的内部组件可使用工厂方法。 继承是扩展软件库或框架默认行为的最简单方法。但是当使用子类替代标准组件时框架如何辨识出该子类解决方案是将各框架中构造组件的代码集中到单个工厂方法中并在继承该组件之外允许任何人对该方法进行重写。 (3) 如果希望复用现有对象来节省系统资源而不是每次都重新创建对象可使用工厂方法。 在处理大型资源密集型对象(如数据库连接、文件系统和网络资源等时 经常需要服用现有对象已节省资源。 正常情况下为实现现有对象的复用其处理流程一般如下 首先创建存储空间来存放经创建的对象。 然后在外部请求对时将优先在对象池中搜索可用对象。如果存在则立即返回该对象。 如果没有可用对象则创建并返回该新对象并将其添加到对象池中。 为避免上述代码不会因为重复而污染程序(对象的创建场景可能很多)可以将这些代码放在试图重用的对象类的构造函数中。 但是从定义上来讲构造函数始终返回的是新对象其无法返回现有实例。针对这种既需要一个能够创建新对象又可以重用现有对象的场景工厂方法是最佳选择。
优缺点
工厂方法模式有以下优点 (1) 将创建产品的代码与实际使用产品的代码分离(解耦)避免产品创建工厂和实际产品之间的紧耦合。 (2) 单一职责原则。产品创建代码放在单独的类里从而使得代码更容易维护。 (3开闭原则。无需更改客户端调用代码 就可以在程序中引入新的产品类型。 但是工厂方法模式也存在以下缺点 (1) 应用工厂方法模式需要引入许多新的子类代码会因此变得更复杂。最好的情况是将该模式引入产品类的现有层次结构中(将工厂类组合到产品类里)。 (2) 由于考虑到系统的可扩展性需要引入抽象层在客户端代码中均使用抽象层进行定义增加了系统的抽象性和理解难度且在实现时可能需要用到反射等技术增加了系统的实现难度。
参考
https://www.edrawsoft.cn/ 亿图图示 《设计模式可复用面向对象软件的基础》 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides 著 李英军, 马晓星 等译 https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/factory_method.html 工厂方法模式 https://refactoringguru.cn/design-patterns/factory-method 工厂方法模式 https://blog.csdn.net/ShuSheng0007/article/details/86636494 秒懂设计模式之工厂方法模式 https://www.runoob.com/design-pattern/factory-pattern.html 工厂模式