最近在整理、学习设计模式相关的知识,大部分是些学习笔记或者网络上整理过来的资料,以利于复习、理解之用。
简单工厂设计模式:
1、接口相关知识复习:
1 一种特殊的抽象类,方法都是抽象的,属性都是常量 2 接口的思想:封装隔离-- 对被隔离体的行为的封装或者对被隔离体的职责的封装 3 使用接口的好处:隔离开外部调用和内部是实现 -- 接口是系统可插拔性的保证 4 接口和抽象类的选择: 5 优先选用接口 6 如果要定义子类的行为又要为子类提供公共功能的时候选择抽象类 7 面向接口编程是Java编程中的一个重要的原则。
2、在java中非常重要的三层:
每一个部分之间的通信都是通过接口进行的,实际上在每一个模块内部也都是通过接口进行通信的。
在Java中实际上子系统(subSystem)、模块(Module)、系统(System)、组件(Component)都是能完成一定功能的封装体。封装体提供给外部的调用方式都是通过接口进行的。
3、经典问题:
请看代码:
View Code
Api.java package com.xinye.designpattern.simplefactory; /** * 接口(提供通用的、抽象的、非具体的功能) * @author xinye * */ public interface Api { public void test(String s); } Impl.java package com.xinye.designpattern.simplefactory; /** * 具体的接口实现类 * @author 实现类 * */ public class Impl implements Api { @Override public void test(String s) { System.out.println("您输入的是:" + s); } } Client.java package 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.java 13 package com.xinye.designpattern.simplefactory; 14 /** 15 * 实现类A 16 * @author xinye 17 * 18 */ 19 public class ImplA implements Api { 20 21 @Override 22 public void test(String s) { 23 System.out.println("实现类A - 您输入的内容:" + s); 24 } 25 26 } 27 28 29 ImplB.java 30 package com.xinye.designpattern.simplefactory; 31 /** 32 * 实现类B 33 * @author xinye 34 * 35 */ 36 public class ImplB implements Api { 37 38 @Override 39 public void test(String s) { 40 System.out.println("实现类B - 您输入的内容:" + s); 41 } 42 43 } 44 45 46 Factory.java 47 package com.xinye.designpattern.simplefactory; 48 /** 49 * 工厂类 50 * @author xinye 51 * 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.java 67 package com.xinye.designpattern.simplefactory; 68 /** 69 * 客户端类 70 * @author xinye 71 * 72 */ 73 public class Client { 74 75 /** 76 * @param args 77 */ 78 public static void main(String[] args) { 79 Api api = Factory.createApi(1); 80 api.test("工厂类中创建的对象"); 81 82 } 83 84 }