设计模式——简单工厂模式
?
??
?
图3? 接口隔离体示意图
/*** 某个接口(通用的、抽象的、非具体的功能) */public interface Api { /** * 某个具体的功能方法的定义,用test1来演示一下。 * 这里的功能很简单,把传入的s打印输出即可 * @param s 任意想要打印输出的字符串 */ public void test1(String s);}?
/*** 对接口的实现 */public class Impl implements Api{ public void test1(String s) { System.out.println("Now In Impl. The input s=="+s); }}?
/*** 客户端:测试使用Api接口*/public class Client { public static void main(String[] args) { Api api = new Impl(); api.test1("哈哈,不要紧张,只是个测试而已!"); }} ?
2:应用简单工厂来解决的思路
?
?Api:
??????? 定义客户所需要的功能接口
Impl:
?????? 具体实现Api的实现类,可能会有多个
Factory:
?????? 工厂,选择合适的实现类来创建Api接口对象
Client:
?????? 客户端,通过Factory去获取Api接口对象,然后面向Api接口编程
/** * 接口的定义,该接口可以通过简单工厂来创建 */public interface Api { /** * 示意,具体的功能方法的定义 * @param s 示意,需要的参数 */ public void operation(String s);}?
/** * 接口的具体实现对象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); }}?
/** * 工厂类,用来创造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; } }?
/** * 客户端,使用Api接口 */public class Client { public static void main(String[] args) { //通过简单工厂来获取接口对象 Api api = Factory.createApi(1); api.operation("正在使用简单工厂"); }}
?/** * 工厂类,用来创造Api对象 */public class Factory { /** * 具体的创造Api对象的方法 * @return 创造好的Api对象 */ public static Api createApi(){ //由于只有一个实现,就不用条件判断了 return new Impl(); }}?
/** * 客户端:测试使用Api接口 */public class Client { public static void main(String[] args) { //重要改变,没有new Impl()了,取而代之Factory.createApi() Api api = Factory.createApi(); api.test1("哈哈,不要紧张,只是个测试而已!"); } }
事实上,简单工厂能帮助我们真正开始面向接口编程,像以前的做法,其实只是用到了接口的多态那部分的功能,最重要的“封装隔离性”并没有体现出来。