設計模式(10):JAVA(10):設計模式(3)工廠模式:提供了一種建立物件的最佳方式(3)抽象工廠
阿新 • • 發佈:2021-09-04
例1 :
package com.woniuxy.j_abstractfactory.a; // 抽象工廠: // 1.減少了工廠方法類,面對產品簇時,類爆炸的反面效果。 // 2.抽象工廠生成的產品簇,就是一系列產品,這些產品之間有邏輯(內在)關係! // 3.現在想多增加一個產品簇, 表現的很好,很讓人滿意! interface Food { public void eat(); } interface Drink { public void drink(); } interface Factory { Food getFood(); Drink getDrink(); }class Hamburger implements Food { @Override public void eat() { System.out.println("漢堡包"); } } class LiangPi implements Food { @Override public void eat() { System.out.println("涼皮!!"); } } class Cola implements Drink { @Override public void drink() { System.out.println("可樂,你值得擁有!"); } } class IcePeek implements Drink { @Override public void drink() { System.out.println("冰峰,從小就喝它"); } } class KFCFactory implements Factory { @Override public Food getFood() { return new Hamburger(); } @Override public Drink getDrink() {return new Cola(); } } class SanQinFactory implements Factory { @Override public Food getFood() { return new LiangPi(); } @Override public Drink getDrink() { return new IcePeek(); } } class Business { public void taste(Factory factory) { Food food = factory.getFood(); Drink drink = factory.getDrink(); System.out.println("評委1:開吃"); food.eat(); drink.drink(); System.out.println("評委1:確實很難吃..."); System.out.println("評委2:開吃"); food.eat(); drink.drink(); System.out.println("評委2:難吃太太..."); System.out.println("評委3:開吃"); food.eat(); drink.drink(); System.out.println("評委3:難吃到家了..."); } } // ======================================================== public class Test { public static void main(String[] args) { Business b = new Business(); b.taste(new KFCFactory()); b.taste(new SanQinFactory()); } } // 缺點: // 你試試,加一個產品等級, 就會“牽一髮 而動全域性”。 說明抽象工廠不適用於產品等級經常變化的情況。 // 如果產品簇中的產品等價是穩定的,則使用抽象工廠才比較何時。反之,還不如使用工廠方法來的更靈活。 // 換一個角度來分析以上程式碼: // 我們都知道,產品就是new出來的物件, 抽象產品就是介面、抽象類。 // 那麼看看現在main方法中,new了誰?? new KFCFactory() , new SanQinFactory() 這2個工廠也可以看做是產品 // 既然是產品,就應該和客戶端解耦,以防產品類名變化,倒置客戶端奔潰!
例2:
package com.woniuxy.j_abstractfactory.b; // 針對於a包所提出的問題,重構程式碼如下: interface Food { public void eat(); } interface Drink { public void drink(); } interface Factory { Food getFood(); Drink getDrink(); } class Hamburger implements Food { @Override public void eat() { System.out.println("漢堡包"); } } class LiangPi implements Food { @Override public void eat() { System.out.println("涼皮!!"); } } class Cola implements Drink { @Override public void drink() { System.out.println("可樂,你值得擁有!"); } } class IcePeek implements Drink { @Override public void drink() { System.out.println("冰峰,從小就喝它"); } } class KFCFactory implements Factory { @Override public Food getFood() { return new Hamburger(); } @Override public Drink getDrink() { return new Cola(); } } class SanQinFactory implements Factory { @Override public Food getFood() { return new LiangPi(); } @Override public Drink getDrink() { return new IcePeek(); } } class Business { public void taste(Factory factory) { Food food = factory.getFood(); Drink drink = factory.getDrink(); System.out.println("評委1:開吃"); food.eat(); drink.drink(); System.out.println("評委1:確實很難吃..."); System.out.println("評委2:開吃"); food.eat(); drink.drink(); System.out.println("評委2:難吃太太..."); System.out.println("評委3:開吃"); food.eat(); drink.drink(); System.out.println("評委3:難吃到家了..."); } } class SimpleFactory { private SimpleFactory() { } public static Factory getFactory(int n) { Factory f = null; switch (n) { case 1: f = new KFCFactory(); break; case 2: f = new SanQinFactory(); break; } return f; } } // ======================================================== public class Test { public static void main(String[] args) { Business b = new Business(); b.taste(SimpleFactory.getFactory(1)); b.taste(SimpleFactory.getFactory(2)); } } // 我們很容易發現,又回到了原點!!!
例3:
package com.woniuxy.j_abstractfactory.c; import java.io.InputStream; import java.util.Properties; import java.util.concurrent.TimeUnit; // 針對於a包所提出的問題,重構程式碼如下: interface Food { public void eat(); } interface Drink { public void drink(); } interface Factory { Food getFood(); Drink getDrink(); } class Hamburger implements Food { @Override public void eat() { System.out.println("漢堡包"); } } class LiangPi implements Food { @Override public void eat() { System.out.println("涼皮!!"); } } class Cola implements Drink { @Override public void drink() { System.out.println("可樂,你值得擁有!"); } } class IcePeek implements Drink { @Override public void drink() { System.out.println("冰峰,從小就喝它"); } } class KFCFactory implements Factory { @Override public Food getFood() { return new Hamburger(); } @Override public Drink getDrink() { return new Cola(); } } class SanQinFactory implements Factory { @Override public Food getFood() { return new LiangPi(); } @Override public Drink getDrink() { return new IcePeek(); } } class Business { public void taste(Factory factory) { Food food = factory.getFood(); Drink drink = factory.getDrink(); System.out.println("評委1:開吃"); food.eat(); drink.drink(); System.out.println("評委1:確實很難吃..."); System.out.println("評委2:開吃"); food.eat(); drink.drink(); System.out.println("評委2:難吃太太..."); System.out.println("評委3:開吃"); food.eat(); drink.drink(); System.out.println("評委3:難吃到家了..."); } } class SimpleFactory { public Factory getFactory( ) { Factory f = null; try { InputStream in = SimpleFactory.class.getResourceAsStream("aa.properties"); Properties prop = new Properties(); prop.load(in); String className = prop.getProperty("factory"); System.out.println(className + "!!!!"); f = (Factory) Class.forName(className).newInstance(); prop.clear(); } catch (Exception e) { e.printStackTrace(); } return f; } } // ======================================================== public class Test { public static void main(String[] args) { while(true) { Business b = new Business(); b.taste(new SimpleFactory().getFactory()); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } }
aa.properties
factory=com.woniuxy.j_abstractfactory.c.KFCFactory
本文來自部落格園,作者:秋華,轉載請註明原文連結:https://www.cnblogs.com/qiu-hua/p/15227308.html