1. 程式人生 > >簡單工廠和工廠方法模式 -- 小案例

簡單工廠和工廠方法模式 -- 小案例

簡單工廠

 

1 public interface Fruit {
2     public void pro(); //生產水果
3     public void eat(); //吃水果
4 }

1 public class Apple implements Fruit {
2     public void pro() {
3         System.out.println("生產蘋果");
4     }
5 
6     public void eat() {
7         System.out.println("吃蘋果");
8     }
9 }


1 public class Banana implements Fruit {
2     public void pro() {
3         System.out.println("生產香蕉");
4     }
5 
6     public void eat() {
7         System.out.println("吃香蕉");
8     }
9 }

 

 1 public class SimpleFactory_1 {
 2 
 3     public static Fruit getFruit(String message){
4 if("apple".equalsIgnoreCase(message)){ 5 return new Apple(); 6 }else if("banana".equalsIgnoreCase(message)){ 7 return new Banana(); 8 }else{ 9 return null; 10 } 11 } 12 13 public static void main(String[] args) { 14 Fruit apple = getFruit("banana");
15 apple.pro(); 16 apple.eat(); 17 } 18 }

這種方式不利於擴充套件 多加一種水果就得多寫一個if else  , 使用反射優化。

 

新增一個儲存路徑的介面  也可以是配置檔案 xml properties等   作用就是新增水果類的時候 直接配置路徑。

 

1 public interface FruitPath {
2     String applePath = "com.dhl.simple_factory_mode.Apple";
3     String bananaPath = "com.dhl.simple_factory_mode.Banana";
4 }

 

 1     public static Fruit getFruit_2(String message) throws Exception {
 2         Class<?> clazz = Class.forName(message);
 3         Fruit fruit = (Fruit) clazz.newInstance();
 4         return fruit;
 5     }
 6 
 7     public static void main(String[] args) throws Exception {
 8         Fruit apple = getFruit_2(FruitPath.applePath);
 9         apple.pro();
10         apple.eat();
11     }

 

 

工廠方法模式:

工廠方法模式就是為了貼合開閉設計原則,擴充套件的時候不修改,可新增。

在簡單工廠模式中 我們定義一個水果介面  定義幾個實現類 就基於反射 或者 ife else建立了  。

工廠方法模式是  定義一個頂級工廠,這個工廠是幹啥的?  是建立單個水果工廠的,然後利用單個水果工廠建立水果例項。 例:使用Factory建立一個AppleFactory蘋果工廠,再利用蘋果工廠建立蘋果例項,那要以後新增水果,就實現Factory來一個對應的水果工廠。

Fruit Apple Banana 和上面一樣。

public interface Factory {
    public  Fruit createFruitFactory();
}
1 public class AppleFactory implements Factory {
2     public Fruit createFruitFactory() {
3         return new Apple();
4     }
5 }
1 public class BananaFactory implements Factory {
2     public Fruit createFruitFactory() {
3         return new Banana();
4     }
5 }

 

 1 public class Client {
 2 
 3     public static void main(String[] args) throws Exception {
 4 
 5         //建立水果工廠
 6         AppleFactory appleFactory = 
            (AppleFactory)Class.forName("com.dhl.factory_method_mode.AppleFactory").newInstance(); 7 BananaFactory bananaFactory =
            (BananaFactory) Class.forName("com.dhl.factory_method_mode.BananaFactory").newInstance(); 8 9 //蘋果工廠建立蘋果 10 Fruit apple = appleFactory.createFruitFactory(); 11 12 //香蕉工廠建立香蕉 13 Fruit banana = bananaFactory.createFruitFactory(); 14 15 16 apple.pro(); 17 apple.eat(); 18 19 banana.pro(); 20 banana.eat(); 21 22 } 23 }

 

一些相關的部落格

http://blog.51cto.com/zero01/2067822