简单工厂模式(Simple Factory)
文字摘自《研磨设计模式》
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");
}
}