工厂方法 Factory Method
工厂方法定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。
工厂方法类图
-
Product:定义工厂方法所创建的对象的接口,也就是实际需要使用的对象的接口。
-
ConcreteProduct:具体的Product接口的实现对象。
-
Creator:创建器,声明工厂方法,工厂方法通常会返回一个Product类型的实例对象,而且多是抽象方法。也可以在Creator里面提供工厂方法的默认实现,让工厂方法返回一个缺省的Product类型的实例对象。
-
ConcreteCreator:具体的创建器对象,覆盖实现Creator定义的工厂方法,返回具体的Product实例。
工厂方法代码实现
-
先看看Product的定义,示例代码如下:
public interface Product { void execute(String word); }
-
再看看具体的Product的实现对象,示例代码如下:
public class ConcreteProductA implements Product { @Override public void execute(String word) { System.out.println("concreteProductA say " + word); } }
-
接下来看看创建器的定义,示例代码如下:
public abstract class Creator { protected abstract Product factoryMethod(); public void execute(String word){ Product product = factoryMethod(); product.execute(word); } }
-
再看看具体的创建器实现对象,示例代码如下:
public class ConcreteCreatorA extends Creator{ @Override protected Product factoryMethod() { return new ConcreteProductA(); } }
-
Client
public class Client { public static void main(String[] args) { Creator creator = new ConcreteCreatorA(); creator.execute("factory method"); } }
工厂方法的思考
工厂方法的本质
工厂方法的本质是延迟到子类来选择实现。
从本质上来讲工厂方法和简单工厂是非常相似的,具体实现上都是在选择实现;不同点在于简单工厂直接在工厂类中进行实现。而工厂方法会把这个工作延迟到子类来实现。
何时选择工厂方法
1. 如果一个类需要创建某个接口的对象,但是又不知道具体的实现,这种情况可以选用工厂方法模式,把创建对象的工作延迟到子类去实现。
2. 如果一个类本身就希望,由它的子类来创建所需的对象的时候,应该使用工厂方法模式。
工厂方法的优缺点
优点
1. 可以在不知具体实现的情况下编程,容易拓展对象的新版本。
2. 连接平行的类层次,具体内容可以参考https://www.jianshu.com/p/f1960652b64b
缺点
1. 具体产品对象和工厂方法的耦合性
体现了设计模式中的哪些原则
工厂方法模式很好的体现了“依赖倒置原则”。
依赖倒置原则告诉我们“要依赖抽象,不要依赖于具体类”,简单点说就是:不能让高层组件依赖于低层组件,而且不管高层组件还是低层组件,都应该依赖于抽象。
对于Creator来说,它不关心具体的实现方式,它只是“面向接口编程”;对于具体的实现来说,它只关心自己“如何实现接口”所要求的功能。
那么倒置的是什么呢?倒置的是这个接口的“所有权”。事实上,Product接口中定义的功能,都是由高层组件Creator来提出的要求,也就是说接口中的功能,是高层组件需要的功能。但是高层组件只是提出要求,并不关心如何实现,而低层组件,就是来真正实现高层组件所要求的接口功能的。因此看起来,低层实现的接口的所有权并不在底层组件手中,而是倒置到高层组件去了。
工厂方法相关模式
工厂方法模式和抽象工厂模式
这两个模式可以组合使用,具体的放到抽象工厂模式中去讲。
工厂方法模式和模板方法模式
这两个模式外观类似,都是有一个抽象类,然后由子类来提供一些实现,但是工厂方法模式的子类专注的是创建产品对象,而模板方法模式的子类专注的是为固定的算法骨架提供某些步骤的实现。
这两个模式可以组合使用,通常在模板方法模式里面,使用工厂方法来创建模板方法需要的对象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!