1. 为什么要用接口
2. 工厂方法模式
1. 为什么要用接口
之前的打印机程序, open、close、print对于惠普、佳能实际上应该都是不同的,
不同的打印机, 开机、关机、打印都应该不同
所以更靠谱的是将Printer定义为interface类型
1 interface Printer{ 2 void Open(); 3 void Close(); 4 void Print(String s); 5 }
1 class HPPrinter implements Printer{ 2 public void Open(){ //少写public报错 3 //自己的理解父类是public, 4 //复写时必须权限大于public 5 System.out.println("HP Open"); 6 } 7 public void Close(){ 8 System.out.println("HP Close"); 9 } 10 public void Print(String s){ 11 System.out.println("HP Print--->" + s ); 12 } 13 }
1 class CannonPrinter implements Printer{ 2 private void Clean(){ 3 System.out.println("Cannon Clean"); 4 } 5 6 public void Close(){ 7 this.Clean(); 8 System.out.println("Cannon Close"); 9 } 10 11 public void Open(){ 12 System.out.println("Cannon Open"); 13 } 14 15 public void Print(String s){ 16 System.out.println("Cannon Print--->" + s ); 17 } 18 }
1 class Test{ 2 public static void main(String args []){ 3 Printer printer = null ; 4 int flag = 0; 5 if( flag == 0){ 6 printer = new HPPrinter(); 7 } 8 else if( flag == 1){ 9 printer = new CannonPrinter(); 10 } 11 printer.Open(); 12 printer.Print("123"); 13 printer.Close(); 14 } 15 }
有100个功能需要使用打印机打印功能, 那就需要Test文件中100个else么? 必然不是
2. 工厂方法模式
减少重复代码, 是将重复代码放在一个地方, 需要使用则调用
修改Test.java, 新增 PrinterFactoy.java
1 class Test{ 2 public static void main(String args []){ 3 int flag = 1 ; 4 Printer printer = PrinterFactory.getPrinter(flag); 5 6 printer.Open(); 7 printer.Print("123"); 8 printer.Close(); 9 } 10 }
1 class PriterFactory(){ 2 public static Printer getPrinter(int flag){ //static便于调用 3 //返回值类型是Printer 4 //函数名是getPrinter 5 Printer printer = null ; 6 if( flag == 0){ 7 printer = new HPPrinter(); 8 } 9 else if( flag == 1){ 10 printer = new CannonPrinter(); 11 } 12 return printer; 13 } 14 }
上面的思路就是 著名的工厂方法模式
增删打印机 的过程
使用者Test.java不需要修改 修改我们的工厂模式代码, 将需要new的在PrinterFactory里面修改
原文:http://www.cnblogs.com/iMirror/p/3738363.html