在物件導向程式設計中,由於有繼承blackdog可以當成dog處理,如果要擴充套件新的dog,只需要新增新的類就好了,因此關鍵時如何建立乙個物件。通常我們使用(dog dog = new blackdod();)建立乙個物件,當我們需要建立乙個新的物件時,就需要更改**,這樣就違背了開閉原則,其次主類除了其固有的功能外,還需要負責建立新的物件,這也違背了單一原則,因此可以增加新的類用於建立物件,稱之為工廠模式。靜態工廠模式
在factory類中用列舉列舉了所要建立的所有物件的名稱,當要建立乙個物件時,使用factory中的靜態方法create建立。
public class factory
public static dog create(dogtype type)
}
使用反射機制進行類註冊的簡單工廠模式
靜態工廠模式中,當我們需要增加乙個新的類時,需要修改factory類,這違背了開閉原則。因此可以增加註冊類物件和例項化類物件的方法,使用map物件來儲存id及其對應的類。但反射機制需要執行時許可權,也會降低效率,可以在dog基類中新增抽象方法newinstance();實現。
public class factory
public dog create(string type) throws illegalacces***ception, instantiationexception
}
使用newinstance方法進行類註冊的簡單工廠模式
在dog基類中新增乙個抽象方法
abstract public dog newinstance();
對每乙個具體的dog,都要實現基類宣告的抽象方法。
@override
public blackdog newinstance()
public class factory
public abstractdog create(string type)
}
工廠方法模式是在靜態工廠模式上的改進,工廠類被抽象化,例項化具體產品的**寫在實現抽象方法的子類中,這樣擴充套件工廠類就可以避免修改**了。
我們來看乙個例子:假設有乙個寵物店,裡面有品種和顏色不同的貓,顧客可以自由決定購買什麼型別的貓。我們先建立乙個cat類和兩個子類,子類為ragdollcat和manxcat.
建立抽象工廠類,抽象工廠類中不包含任何建立例項的**。
public abstract class abstractfactory
}
我們建立了abstractfactory的子類catfactory類,實現了例項化貓的**。
public class catfactory extends abstractfactory
}
在客戶端,我們只需建立工廠類,獲取貓。
abstractfactory catfactory = new catfactory();
catfactory.ordercat("manx","white");
抽象工廠模式是工廠方法模式的擴充套件,圍繞乙個超級工廠建立其他工廠,它建立一系列相關聯的物件,該超級工廠又稱為其他工廠的工廠。
還以上面的寵物店為例,裡面不僅有品種不同的貓,還有品種不同的狗,顧客可以自由決定購買什麼型別的貓和狗。我們先建立乙個cat類和兩個子類,子類為ragdollcat和manxcat,然後再建立乙個dog類和兩個子類,子類為huskydog和poodledog。
為 cat和 dog 物件建立抽象類來獲取工廠
public abstract class abstractfactory
建立擴充套件了 abstractfactory 的工廠類,基於給定的資訊生成實體類的物件。
public class dogfactory extends abstractfactory
@override
public cat getcat(string breed)
}
public class catfactory extends abstractfactory
@override
public cat getcat(string breed)
}
建立乙個工廠生成器類,通過傳遞cat或dog資訊來獲取工廠。
public class factoryproducer else if(choice.equalsignorecase("dog"))
return null;
}}
在客戶端,我們先獲取具體的工廠類物件,再通過工廠類物件獲取貓或狗。
//獲取cat工廠
abstractfactory catfactory = factoryproducer.getfactory("cat");
//獲取ragdollcat
cat ragdollcat = catfactory.getcat("ragdoll");
設計模式 工廠模式 抽象工廠模式
建立物件時不會對客戶暴露建立邏輯,並且通過使用乙個共同的介面來指向建立的物件。sept1 建立乙個公共介面,將要對外開放的方法在這裡定義。sept2 建立實現介面的類,用即實現對外開放的類的方法 sept3 建立工廠,提供乙個get方法,這個方法提供返回實現類的物件 建立選擇 sept4 使用,建立...
設計模式 工廠設計模式
用於建立物件的介面,交給子類去實現 我們舉乙個生產nokia的例子 public abstract class nokiaphone先試定義了乙個抽象類,抽象出方法poweronphone 模擬手機開機的動作 public class nokia5200 extends nokiaphone pub...
設計模式 工廠設計模式
工廠模式分為工廠方法模式和抽象工廠模式 工廠方法模式分為 普通工廠模式,就是建立乙個工廠類,對實現了同一介面的一些類進行例項的建立。多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件。靜態工廠...