简单工厂模式【读书笔记】
简单工厂模式并不是一个标准的设计模式,但是太常用了,所以来学习总结一下。
简单工厂的定义:
提供了一个创建对象实例的功能,而无需关心其具体实现。被创建实例的类型可以是借口、抽象类,也可以是对象的实例。
问题场景:
有个接口定义为Api,实现类为Impl,怎么在客户端使用这个接口?
接口:
package com.matrix1024.simplefactory; public interface Api { /** * 通过传入的不同语言,打印问候语 * @param language 语言类型 */ public void sayHello(String language); }
实现类:
package com.matrix1024.simplefactory; public class Impl implements Api{ @Override public void sayHello(String language) { System.out.println(language+":Hello,Simple Factory design pattern!"); } }
测试客户端:
package com.matrix1024.simplefactory; /** * 客户端,用来测试Api接口 * @author Matrix * */ public class Client { public static void main(String [] args) { Api api = new Impl(); api.sayHello("English"); } }
测试结果如下:
English:Hello,Simple Factory design pattern!
看看上面的代码,我们发现:
Api api = new Impl();
客户端在调用接口的时候,已经知道了接口的具体实现就是Impl,接口的思想就是"封装隔离",所以实现类Impl应该是被封装好的,同时和客户端是隔离的,也就是说客户端不应该知道Api接口的具体实现。
但是如果不在Client里面具体实例实现类,该如何获得这个接口对象呢?
问题描述:
在java开发中,如果只知道接口而不知道实现?该怎么办呢?
解决上述问题的一个解决方法就是简单工厂模式。
简单工厂模式中,接口的实现已经完成,现在客户端只是知道接口,而不知道接口的具体实现,当出现多个实现类的时候,由工厂来完成”选择“职责。
增加一个接口实现类:
package com.matrix1024.simplefactory; public class ChineseImpl implements Api { @Override public void sayHello(String language) { System.out.println(language+":你好,简单工厂模式!"); } }
简单工厂的实现类:
package com.matrix1024.simplefactory; /** * 简单工厂模式 * @author Matrix * */ public class SimpleFactory { /** * 创建用户需要的api * @param language 用户传入的需求 * @return */ public static Api CreateApi(String language) { Api api = null; if("Chinese".equals(language)){ api = new ChineseImpl(); }else{ api = new Impl(); } return api; } }
由上面的代码我们可以看出:简单工厂的本质是选择实现。
实现类已经完成,简单工厂需要根据用户的需要(用户需要知道传入参数对选择实现的改变)去选择不同的实现类来满足用户的需要。
在简单工厂模式中,存在三个部分:Client,SimpleFactory,API(Implement Class)。
在这其中,simpleFactory和API对Client部分开放,Client知道传入参数和获得实现类的对应关系。
---《研读设计模式》读书笔记