简单工厂 Simple Factory
简单工厂的定义
提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。
简单工厂类图
-
Api:定义客户所需要的功能接口
-
Impl:具体实现Api的实现类,可能存在多个
-
Factory:工厂,选择合适的实现类来创建Api接口对象
-
Client:客户端,通过Factory去获取Api接口对象,然后面向Api接口编程
简单工厂代码实现
接下来我们按照上图进行简单工厂的实现
-
接口Api编写
/** * 接口的定义,该接口可以通过简单工厂来创建 */ public interface Api { /** * 示意,具体的功能方法的定义 * @param s 示意,需要的参数 */ public void operation(String s); }
-
实现接口Api的实现类Impl编写
/** * 接口的具体实现对象A */ public class ImplA implements Api{ public void operation(String s) { //实现功能的代码,示意一下 System.out.println("ImplA s=="+s); } } /** * 接口的具体实现对象B */ public class ImplB implements Api{ public void operation(String s) { // 实现功能的代码,示意一下 System.out.println("ImplB s=="+s); } }
-
简单工厂SimpleFactory的实现
/** * 工厂类,用来创造Api对象 */ public class Factory { /** * 具体的创造Api对象的方法 * @param condition 示意,从外部传入的选择条件 * @return 创造好的Api对象 */ public static Api createApi(int condition){ //应该根据某些条件去选择究竟创建哪一个具体的实现对象, //这些条件可以从外部传入,也可以从其它途径获取。 //如果只有一个实现,可以省略条件,因为没有选择的必要。 //示意使用条件 Api api = null; if(condition == 1) { api = new ImplA(); } else if(condition == 2) { api = new ImplB(); } return api; } }
-
客户端Client通过简单工厂获得实例对象
/** * 客户端,使用Api接口 */ public class Client { public static void main(String[] args) { //通过简单工厂来获取接口对象 Api api = Factory.createApi(1); api.operation("正在使用简单工厂"); } }
简单工厂的思考
简单工厂不是设计模式,更像是一种编程习惯,便于我们理解面向接口编程的真正含义,封装隔离。
简单工厂的本质是选择实现
简单工厂的重点在于选择,实现是已经做好了的。简单工厂的目的在于为客户端来选择相应的实现,从而使得客户端和实现之间的解耦。
何时选择简单工厂
1. 如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,
可以选用简单工厂,让客户端通过工厂来获取相应的接口,而无须关心具体实现。
2. 如果想要把对外创建对象的职责集中管理和控制,
可以选用简单工厂,一个简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到一个简单工厂来,从而实现集中管理和控制
简单工厂的优缺点
优点
帮助封装
简单工厂虽然很简单,但是非常友好的帮助我们实现了组件的封装,然后让组件外部能真正面向接口编程。
解耦
通过简单工厂,实现了客户端和具体实现类的解耦。
缺点
可能增加客户端的复杂度
如果通过客户端的参数来选择具体的实现类,那么就必须让客户端能理解各个参数所代表的具体功能和含义,
这会增加客户端使用的难度,也部分暴露了内部实现,这种情况可以选用可配置的方式来实现。
不方便扩展子工厂
私有化简单工厂的构造方法,使用静态方法来创建接口,也就不能通过写简单工厂类的子类来改变创建接口的方法的行为了。
不过,通常情况下是不需要为简单工厂创建子类的。
体现了设计模式中哪些原则
简单工厂体现了依赖倒转原则,即Client只知道Simple Factory和Api并不了解其具体实现。
简单工厂体现了迪米特法则,即Client只与Simple Factory和Api进行作用,无论Api中存在多少实现类。
简单工厂违背了开闭原则,即一旦添加了新的Api实现类就不得不修改工厂类的逻辑。
简单工厂相关模式
简单工厂和抽象工厂
简单工厂是用来选择实现的,可以选择任意接口的实现,
一个简单工厂可以有多个用于选择并创建对象的方法,多个方法创建的对象可以有关系也可以没有关系。
抽象工厂模式是用来选择产品簇的实现的,
也就是说一般抽象工厂里面有多个用于选择并创建对象的方法,但是这些方法所创建的对象之间通常是有关系的,这些被创建的对象通常是构成一个产品簇所需要的部件对象。
所以从某种意义上来说,
简单工厂和抽象工厂是类似的,如果抽象工厂退化成为只有一个实现,不分层次,那么就相当于简单工厂了。
简单工厂和工厂方法
简单工厂和工厂方法模式也是非常类似的。
工厂方法的本质也是用来选择实现的,跟简单工厂的区别在于工厂方法是把选择具体实现的功能延迟到子类去实现。如果把工厂方法中选择的实现放到父类直接实现,那就等同于简单工厂。
简单工厂和创建对象实例的
简单工厂的本质是选择实现,
所以它可以跟其它任何能够具体的创建对象实例的模式配合使用,比如:单例模式、原型模式、生成器模式等等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!