標籤:告訴 system 代碼 port 上進 abs public new 使用者
原廠模式是一種建立性模式,提供的就是一種建立對象的方式,解決的就是使用者和產品之間的問題,隱藏生產產品的實現細節,使用者只需要關心最後的結果。官方的定義是:定義一個建立對象的介面,讓其子類自己決定執行個體化哪一個工廠類,原廠模式使其建立過程延遲到子類進行。
下面利用窮舉法舉幾個例子:
1.使用者去汽車工廠買汽車,需要什麼汽車買什麼汽車,不用只要汽車的生產細節。
2.咱們hibernate裡面設定資料庫選擇方言,配置什麼方法就出現什麼資料庫,隱藏了實現細節。
3.咱們去小時買牛奶,選什麼牌子買什麼牌子,不用知道牛奶怎麼生產的。
簡單工廠
package pattern.factory;public interface Milk { public String getName();}
package pattern.factory;public class MengNiu implements Milk { @Override public String getName() { return "蒙牛"; }}
package pattern.factory;public class TeLunSu implements Milk { @Override public String getName() { return "特侖蘇"; }}
package pattern.factory;public class YiLi implements Milk { @Override public String getName() { return "伊利"; }}
import pattern.factory.TeLunSu;import pattern.factory.YiLi;public class SimpleFactory { public Milk getMilk(String name){ Milk milk=null; if("特侖蘇".equals(name)){ milk=new TeLunSu(); } if("蒙牛".equals(name)){ milk=new MengNiu(); } if("伊利".equals(name)){ milk=new YiLi(); } return milk; }}
package pattern.factory.simple;public class SimpleFactoryTest { public static void main(String[] args) { //把使用者的需要的產品告訴工廠 //主要是隱藏產品的建立過程,使用者無需知道牛奶的建立過程 SimpleFactory simpleFactory=new SimpleFactory(); System.out.println(simpleFactory.getMilk("特侖蘇")); }}
簡單工廠通過代碼看上去其實想一個小作坊的模式,什麼產品的牛奶都有,分工不是很明確,所有的產品共用一個工廠,而且方法需要一個參數手動的輸入,增加了出錯的機率。
Factory 方法
public class MengNiuFactory implements Factory { @Override public Milk getMilk() { return new MengNiu(); }}
package pattern.factory.func;import pattern.factory.Milk;import pattern.factory.TeLunSu;public class TeLunSuFactory implements Factory { @Override public Milk getMilk() { return new TeLunSu(); }}
package pattern.factory.func;import pattern.factory.Milk;import pattern.factory.YiLi;public class YiLiFactory implements Factory { @Override public Milk getMilk() { return new YiLi(); }}
package pattern.factory.func;import pattern.factory.Milk;public interface Factory { public Milk getMilk();}
package pattern.factory.func;public class FactoryTest { public static void main(String[] args) { Factory factory=new MengNiuFactory(); System.out.println(factory.getMilk()); }}
Factory 方法像是工廠式的模式生產,一個產品對應一個工廠然後進行組裝,這個比較規範,可以進行批量標準化規模化的生產,不過也可以看出使用者選擇產品有點不方便。
抽象工廠
package pattern.factory.abstr;import pattern.factory.Milk;public abstract class AbstractFactory { public abstract Milk getTeLunSu(); public abstract Milk getYiLi(); public abstract Milk getMengNiu();}
package pattern.factory.abstr;import pattern.factory.Milk;import pattern.factory.func.MengNiuFactory;import pattern.factory.func.TeLunSuFactory;import pattern.factory.func.YiLiFactory;public class MilkFactory extends AbstractFactory { @Override public Milk getTeLunSu() { return new TeLunSuFactory().getMilk(); } @Override public Milk getYiLi() { return new YiLiFactory().getMilk(); } @Override public Milk getMengNiu() { return new MengNiuFactory().getMilk(); }}
package pattern.factory.abstr;public class AbstractFactoryTest { public static void main(String[] args) { AbstractFactory abstractFactory=new MilkFactory(); abstractFactory.getMengNiu(); }}
個人感覺抽象工廠和Factory 方法其實很像,但是它在Factory 方法的基礎上進行了再次封裝,靈活性更好,使用者可以隨便選取自己想要的產品,同時也體現了代碼的擴充性,抽象工廠的好處也比介面要好,因為抽象類別裡面可以處理一下都可以用到的邏輯代碼,寫一些方法,看著有點像流水線的模式,一條線生產一個產品。
原廠模式精講