最近在整理、学习设计模式相关的知识,大部分是些学习笔记或者网络上整理过来的资料,以利于复习、理解之用。
简单工厂设计模式:
1、接口相关知识复习:
1 一种特殊的抽象类,方法都是抽象的,属性都是常量2 接口的思想:封装隔离-- 对被隔离体的行为的封装或者对被隔离体的职责的封装3 使用接口的好处:隔离开外部调用和内部是实现 -- 接口是系统可插拔性的保证4 接口和抽象类的选择:5 优先选用接口6 如果要定义子类的行为又要为子类提供公共功能的时候选择抽象类7 面向接口编程是Java编程中的一个重要的原则。
2、在java中非常重要的三层:
![](https://images0.cnblogs.com/blog/405193/201303/25002340-51a071b4e6674988a86b3837f464a866.png)
每一个部分之间的通信都是通过接口进行的,实际上在每一个模块内部也都是通过接口进行通信的。
在Java中实际上子系统(subSystem)、模块(Module)、系统(System)、组件(Component)都是能完成一定功能的封装体。封装体提供给外部的调用方式都是通过接口进行的。
3、经典问题:
请看代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
Api.javapackage com.xinye.designpattern.simplefactory;/** * 接口(提供通用的、抽象的、非具体的功能) * @author xinye * */public interface Api { public void test(String s);}Impl.javapackage com.xinye.designpattern.simplefactory;/** * 具体的接口实现类 * @author 实现类 * */public class Impl implements Api { @Override public void test(String s) { System.out.println("您输入的是:" + s); }}Client.javapackage com.xinye.designpattern.simplefactory;/** * 客户端类 * @author xinye * */public class Client { /** * @param args */ public static void main(String[] args) { Api api = new Impl(); api.test("我正在学习设计模式"); }}
问题:客户端需要知道接口和具体的实现类。
由此可见简单工厂模式的主要功能是:不想让客户端知道具体的实现的时候可以使用。4、解决办法:
代码:
1 Api.java 2 package com.xinye.designpattern.simplefactory; 3 /** 4 * 接口(提供通用的、抽象的、非具体的功能) 5 * @author xinye 6 * 7 */ 8 public interface Api { 9 public void test(String s);10 }11 12 ImpA.java13 package com.xinye.designpattern.simplefactory;14 /**15 * 实现类A16 * @author xinye17 *18 */19 public class ImplA implements Api {20 21 @Override22 public void test(String s) {23 System.out.println("实现类A - 您输入的内容:" + s);24 }25 26 }27 28 29 ImplB.java30 package com.xinye.designpattern.simplefactory;31 /**32 * 实现类B33 * @author xinye34 *35 */36 public class ImplB implements Api {37 38 @Override39 public void test(String s) {40 System.out.println("实现类B - 您输入的内容:" + s);41 }42 43 }44 45 46 Factory.java47 package com.xinye.designpattern.simplefactory;48 /**49 * 工厂类50 * @author xinye51 *52 */53 public class Factory {54 public static Api createApi(int condition){55 Api api = null;56 if(condition == 1){57 api = new ImplA();58 }else{59 api = new ImplB();60 }61 return api;62 }63 }64 65 66 Client.java67 package com.xinye.designpattern.simplefactory;68 /**69 * 客户端类70 * @author xinye71 *72 */73 public class Client {74 75 /**76 * @param args77 */78 public static void main(String[] args) {79 Api api = Factory.createApi(1);80 api.test("工厂类中创建的对象");81 82 }83 84 }