1 interface Fruit{ 2 public void eat(); 3 } 4 class Apple implements Fruit{ 5 public void eat() { 6 System.out.println("吃苹果"); 7 } 8 } 9 class Orange implements Fruit{ 10 public void eat() { 11 System.out.println("吃橘子"); 12 } 13 } 14 public class TestFactory { 15 @Test 16 public void test() { 17 Fruit f = new Apple(); 18 f.eat(); 19 } 20 }
这样的代码有没有问题呢?从程序的设计思路上,主方法应该就表示一个客户端,住房法中的代码应该越少越好。此时在主方法中直接指定了要操作的子类,就表示了客户端和特定的子类紧密的耦合在一起了,这时如果要更换子类,就需要改变客户端。
我们参考JVM的工作原理:程序->JVM->操作系统。这就是一个解耦合的范例,我们写的程序不用关心在哪个OS上运行,用JVM来作为程序和操作系统之间的中间体,而不必将一个程序和固定的OS耦合在一起。
解决方法:
此过渡端在程序中就称为工厂设计。
1 interface Fruit{ 2 public void eat(); 3 } 4 class Apple implements Fruit{ 5 public void eat() { 6 System.out.println("吃苹果"); 7 } 8 } 9 class Orange implements Fruit{ 10 public void eat() { 11 System.out.println("吃橘子"); 12 } 13 } 14 class Factory{ //定义工厂类 15 public static Fruit getInstance(String className) { 16 Fruit f = null; 17 //"apple"写在前面是因为这样就可以避免className为空值后出现NullPointerException 18 if("apple".equals(className)) { 19 f = new Apple(); 20 } 21 if("orange".equals(className)) { 22 f = new Orange(); 23 } 24 return f; 25 } 26 } 27 public class TestFactory { 28 @Test 29 public void test() { 30 Scanner scanner = new Scanner(System.in); 31 String str = scanner.next(); 32 Fruit f =Factory.getInstance(str); 33 if(f!=null) 34 f.eat(); 35 } 36 }
在加入工厂类后,每次客户端只负责给用户输入或输出,它的代码几乎不用变,实现了低耦合。
工厂类执行流程