简单工厂设计模式
JAVA的的面向接口编程是一种非常重要的设计思想.
通常接口设计思路
实例代码:
/*
接口(通用,抽象,非具体功能)
*/
public interface Api {
//一组接口定义
public void test1(String s);
}
/*
对接口的实现类
*/
public class Impl implements Api {
public void test1(String s) {
sysout("我实现了Api的接口,S=" + s);
}
}
/*
客户端,接口调用代码
*/
public class Client {
public static void main(String[] args) {
Api api = new Impl();
api.test1("我是传给s参数的字符串");
}
}
通常我们在学习接口的时候,就是这么学的也是这么用的,但是这样存在一个小的弊端
请看这句话,Api api = new Impl();
接口的思想就是"封装隔离",而实现类Impl应该是被接口Api封装的,并且与客户端进行隔离,也就是说客户端根本就不应该知道
Impl是具体Api的实现类,如何才能更高的设计解决方案呢?答案就是使用"简单工厂设计模式"
简单工厂定义
定义:提供一个创建对象实例的功能,而无需关心具体实现.被创建实例类型可以是接口,抽象类,也可以是具体类
- Api:定义客户所需要的接口
- Impl:具体实现Api接口的实现类,可能会有多个,如:ImplA,ImplB
- Factory:工厂类,负责创建具体实现Api接口对象
- Client:客户端,通过Factory类来获取对象接口,然后面向Api接口编程
工厂方法实例代码:
/*
接口定义,接口可以通过工厂方法来创建
*/
public interface Api {
public void operation(String s);
}
/*
接口的具体实现类A
*/
public class ImplA implements Api {
public void operation(String s) {
sysout("ImplA S = " + s);
}
}
/*
接口的具体实现类B
*/
public class ImplB implements Api {
public void operation(String s) {
sysout("ImplB S = " + s);
}
}
/*
工厂类,用来创建Api对象
*/
public class Factory {
public static Api createApi(int condition) {
//根据传入的condition条件,选择究竟创建那一个具体的实现类的对象
Api api = null;
if(condition == 1) {
api = new ImplA();
} else if( condition == 2) {
api = new ImplB();
}
return api;
}
}
/*
客户端,使用Api接口
*/
public class Client {
public static void main(String[] args) {
Api api = Factory.createApi(1);
api. operation("正在使用工厂方法,创建对象");
}
}
- 简单工厂--通常是用来创建一个接口,抽象类或具体类的实例
- 静态工厂--使用工厂时,通常是不用创建工厂的对象,可以将工厂定义为一个工具类,直接使用静态方法就可以了,为了防止客户端创建工厂实例,可以将构造函数私有化
- 万能工厂--一个工厂理论上可以创造任何对象,只要根据不同的接口提供不能的创建实例的方法即可
- 工厂范围--虽然理论上来讲,工厂可以创建任何对象,但是通常建议定义在一个组件或一个模块的级别
- 工厂命名--类名建议为"模块名称+Factory",比如:用户模块工厂UserFactory,方法名称通常是get+接口名称或create+接口名称
工厂方法的执行示意图
工厂方法的本质
选择实现
何时选用简单工厂
- 如果想完全封装具体实现,让外部只能通过接口来操作封装体,那么可以选择简单工厂,让客户端通过工厂来获取相应接口,而无需关心具体的实现.
- 如果想把对外创建对象的职责集中管理和控制,那么选择简单工厂,一个简单的工厂可以创建很多的,不相关的对象,可以把对外创建对象的职责集中到一个简单的工厂来,从而实现集中管理和控制.
示例代码
/*
* 定义一组功能接口
*/
public interface InterfaceApi {
public void apiA();
public void apiB();
}
-------------------------------------------------------------------------------------
/*
* 实现接口的功能类A
*/
public class ApiImplA implements InterfaceApi {
@Override
public void apiA() {
System.out.println("我是类ApiImplA,我实现了Api接口的apiA方法");
}
@Override
public void apiB() {
System.out.println("我是类ApiImplA,我实现了Api接口的apiB方法");
}
}
-------------------------------------------------------------------------------------
/*
* 实现接口的功能类B
*/
public class ApiImplB implements InterfaceApi {
@Override
public void apiA() {
System.out.println("我是类ApiImplB,我实现了Api接口的apiA方法");
}
@Override
public void apiB() {
System.out.println("我是类ApiImplB,我实现了Api接口的apiB方法");
}
}
-------------------------------------------------------------------------------------
/*
* 工厂模式,根据参数,返回对应的具体实现类
*/
public class SimpleFactory {
public static InterfaceApi createApi(int i) {
InterfaceApi api = null;
if (i == 1) {
api = new ApiImplA();
} else {
api = new ApiImplB();
}
return api;
}
}
-------------------------------------------------------------------------------------
public class Clinet {
public static void main(String[] args) {
// 通过简单工厂模式,返回对应的实现类对象
InterfaceApi api = SimpleFactory.createApi(2);
api.apiA();
api.apiB();
}
}