文字摘自《研磨设计模式》
1、 简单工厂的定义:
提供一个创建对象实例的功能,而无需关心其具体实现。被创建的实例的类型可以是接口、抽象类、也可以是具体的类。
2、 模型图:
Api:定义客户所需要的功能接口。
Impl:具体实现Api的实现类,可能会有多个。
Factory:工厂,选择合适的实现类来创建Api接口对象。
Client:客户端,通过Factory来获取Api接口对象,然后面向Api接口编程。
3、 简单工厂的优点:
3、1 帮助封装
简单工厂虽然很简单,但是非常友好地帮助我们实现了组件的封装,然后让组件外部能真正的面向接口编程。
3、2 解耦
通过简单工厂,实现了客户端和具体实现类的解耦。客户端根本就不知道具体是由谁来实现,也不能知道具体是如何实现的,客户端只是通过工厂获取它所需要的接口 对象。
4、 简单工厂的缺点:
4、1 可能增加客户端的复杂度
如果通过客户端的参数来选择具体的实现类,那么酒必须让客户端能理解各个参数所代表的具体功能和含义,这样会增加客户端使用的难度,也部分暴露了内部实现,这 种情况可以选用可配置的方式来实现。
4、2 不方便扩展子工厂
私有化简单工厂的构造当,使用静态方法来创建接口,也就不能通过写简单工厂类的子类来改变创建接口的方法的行为了。不过通常情况下是不需要为简单工厂创建子 类的。
5、 简单工厂的本质:
简单工厂的本质是:选择实现。
6、具体实现:
package org.swinglife.factory; /*** * Api接口 * @author Swing * */ public interface Api { public void operation(String str); }
package org.swinglife.factory; /*** * Api实现类A * @author Swing * */ public class ImplA implements Api { @Override public void operation(String str) { System.out.println("ImplA to say: "+str); } }
package org.swinglife.factory; /*** * Api实现类B * @author Swing * */ public class ImplB implements Api { @Override public void operation(String str) { System.out.println("ImplB to say: "+str); } }
package org.swinglife.factory; public class Factory { //私有化构造函数 private Factory(){} /*** * 创建API的工厂方法,通过传递过来的type类型来决定要创建哪个对象。 * @param type * @return */ public static Api createApi(int type) { switch (type) { case 1: return new ImplA(); case 2: return new ImplB(); default: return null; } } }
package org.swinglife.factory; public class Client { public static void main(String[] args) { Api api = Factory.createApi(2); api.operation("hello"); } }