簡單工廠和工廠方法模式 -- 小案例
阿新 • • 發佈:2018-11-15
簡單工廠
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