工厂设计模式

Posted weller

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂设计模式相关的知识,希望对你有一定的参考价值。

 

 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 }

在加入工厂类后,每次客户端只负责给用户输入或输出,它的代码几乎不用变,实现了低耦合。

工厂类执行流程

 

以上是关于工厂设计模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式-简单工厂工厂方法模式抽象工厂模式详解

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式之工厂方法和抽象工厂