定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。
类型:对象创建型模式
简单工厂模式
简单工厂模式是工厂方法模式的一个特例,通过简单工厂方法模式的类图可以看到,工厂方法模式有三个要素:
1、工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
3、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
简单工厂实例代码
(1) Api定义的示例代码如下:
package com.example.test.ch2; /** * 接口的定义,该接口可以通过简单工厂来创建 * */ public interface Api { /** * 示意,具体功能方法的定义 * @param s */ public void operation(String s); }
package com.example.test.ch2; /** * 接口的具体实现对象A * */ public class ImplA implements Api { @Override public void operation(String s) { //实现功能的代码,示意一下 System.out.println("ImplA s="+s); } }
package com.example.test.ch2; /** * 接口的具体实现对象B * */ public class ImplB implements Api { @Override public void operation(String s) { //实现功能的代码,示意一下 System.out.println("ImplB s="+s); } }
package com.example.test.ch2; /** * 工厂类,用来创建Api对象 * */ public class Factory { /** * 创建具体Api对象的方法 * @param condition * @return */ public static Api createApi(int condition){ //应该根据某些条件去选择究竟创建哪一个具体的实现对象 Api api = null; if(condition==1){ api = new ImplA(); }else if(condition==2){ api = new ImplB(); } return api; } }
package com.example.test.ch2; public class Client { /** * @param args */ public static void main(String[] args) { //通过简单工厂来获取接口对象 Api api = Factory.createApi(1); api.operation("正在使用简单工厂"); } }
简单工厂有以下优点
帮助封装
简单工厂虽然很简单,但是非常友好的帮我们实现了组件的封装,然后让组件外部能真正面向接口编程。
解耦
通过简单工厂,实现了客户端和具体实现类的解耦。
简单工厂有以下缺点
可能增加客户端的复杂度
如果通过客户端的参数来选择具体的实现类,那么就必须让客户端能理解各个参数所代表的具体功能和含义,这样会增加客户端使用的难度,也部分暴露了内部实现。
不方便扩充子工厂
私有化简单工厂的构造方法,使用静态方法来创建接口,也就不能通过写简单工厂类的子类来改变创建接口的方法的行为了。不过通常情况下是不需要为简单工厂创建子类的。
简单工厂的本质:选择实现
何时选用简单工厂
建议在以下情况中选用简单工厂。
相关模式
简单工厂和抽象工厂模式
简单工厂是用来选择实现的,可以选择任意接口的实现。一个简单工厂可以有多个用于选择并创建对象的方法,多个方法创建的对象可以有关系也可以没有关系。
抽象工厂模式是用来选择产品簇的实现的。也就是说一般抽象工厂里面有多个用于选择并创建对象的方法,但是这些方法所创建的对象之间通常是有关系的,这些被创建的对象通常是构成一个产品簇所需要的部件对象。
所以从某种意义上来说,简单工厂和抽象工厂是类似的,如果抽象工厂退化成为只有一个实现,不分层次,那么就相当于简单工厂了。
简单工厂和工厂方法模式
简单工厂和工厂方法模式也是非常类似的。
工厂方法的本质也是用来选择实现的,跟简单工厂的区别在于工厂方法是把选择具体实现的功能延迟到子类去实现。
如果把工厂方法中选择的实现放到父类中直接实现,那就等于简单工厂。