主要是学习Mars的Java4Android 接口的应用这集视频做的笔记
引例:
接口是面向对象的核心,
例子是有一个Printer的接口(定义一种标准,有开机、关机和打印),然后HPPrinter类、CanonPrinter类去实现这个接口
1、Printer.java
interface Printer{ public void open(); public void close(); public void print(String s); }2、HPPrinter.java
class HPPrinter implements Printer{ public void open(){ System.out.println("HP open"); } public void close(){ System.out.println("HP close"); } public void print(String s){ System.out.println("HP print---" + s); } }3、CanonPrinter.java
class CanonPrinter implements Printer{<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>private void clean(){ <span style="white-space:pre"> </span>System.out.println("clean"); <span style="white-space:pre"> </span>}<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>public void close(){ <span style="white-space:pre"> </span>this.clean(); <span style="white-space:pre"> </span>System.out.println("Canon close");<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public void open(){ <span style="white-space:pre"> </span>System.out.println("Canon open"); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public void print(String s){ <span style="white-space:pre"> </span>System.out.println("Canon print--->" + s); <span style="white-space:pre"> </span>} }4、Test.java
class Test{ public static void main(String args []){ Printer printer = null; int flag == 1; if(flag == 0){ printer = new HPPrinter(); } if(flag == 1){ printer = new CannonPrinter(); } printer.open(); printer.print("test"); printer.close(); } }问题:
如果只是定义了一个抽象产品类角色(Printer工厂模式具体讲解)和具体产品类角色(HPPrinter、CanonPrinter),
那么测试用例(Test.java)就需要不断的new 具体打印机,(如果写另外一个测试用例,还是在new 具体打印机)
这时是重复写代码。
解决方法:静态工厂模式(又称简单工厂模式)
面向对象的终极目标之一就是减少重复代码。
把重复代码放在一个地方,当需要这些代码所提供的功能时,不是重复写一遍代码,而是调用这些功能。
加入入一个工厂类角色,把new 具体打印机的功能放在这个类中:
(设计静态工厂模式的思路就是:生成对象的代码(即使用new调用构造函数的代码)封装在工厂类当中)
PrinterFactory.java
class PrinterFactory{ public static Printer getPrinter(int flag){ //静态函数 向上转型 Printer printer = null; if(flag == 0){ printer = new HPPrinter(); } else if (flag == 1) { printer = new CanonPrinter(); } return printer; } }此时测试用例可以改写成调用PrinterFactory的getPrinter方法:
Test.java
class Test{ public static void main(String args []){ int flag = 1; Printer printer = PrinterFactory.getPrinter(flag); printer.open(); printer.print("test"); printer.close(); } }在这个例子中使用静态工厂模式好处是:
使用者不需要new 打印机,只需调用即可,不需要知道子类,而开发者也方便修改
(工厂类负责所有产品对象的创建,客户端在需要创建对象时,告诉工厂需要哪种类型,工厂就负责创建。)
设计模式结构图:
本文例子的结构图:
深入理解工厂模式:
静态工厂模式再往复杂方向变化是
工厂模式(过一个抽象工厂类角色)
参考点击打开链接
抽象工厂模式
参考点击打开链接
原文:http://blog.csdn.net/zhanhong39/article/details/44573241