1、描述
- 工廠模式的本質(zhì)就是用工廠方法代替new操作創(chuàng)建一種實(shí)例化對象的方式。
- 在創(chuàng)建對象時不會對客戶端暴露創(chuàng)建邏輯曹鸠,并且是通過使用一個共同的接口來指向新創(chuàng)建的對象煌茬。
- 工廠模式可分為簡單工廠模式,工廠方法模式和抽象工廠模式三類彻桃。
2.1 簡單工廠模式
- 簡單工廠模式屬于類的創(chuàng)建型模式坛善,又叫靜態(tài)工廠方法模式。通過專門定義一個工廠類來負(fù)責(zé)創(chuàng)建其他類的實(shí)例叛薯,被創(chuàng)建的實(shí)例通常都具有共同的父類浑吟。
2.1.1 簡單工廠模式含有3個角色
1)工廠角色(Creator)
這是簡單工廠模式的核心,它用來負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯耗溜。工廠類可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對象省容。
public class CarFactory {
public static Car creatCar(String type){
Car car= null;
// 這里我們通過switch來判斷抖拴,具體制作哪一個品牌的車
switch(type){
case "Benz":
car= new Benz();
break;
case "BYD":
car= new BYD();
break;
case "Bentley ":
car= new Bentley();
break;
default:
break;
}
return car;
}
}
2)抽象角色(Product)
這是簡單工廠模式所創(chuàng)建的所有對象的父類,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口腥椒。該類可以是接口阿宅,也可以是抽象類。
public interface Car{
public void run();
}
3)具體產(chǎn)品角色(Concrete Product)
簡單工廠模式所創(chuàng)建的具體的實(shí)例對象笼蛛。
public class Benz implements Car{
public void run(){
System.out.println("這是Benz");
}
}
public class BYD implements Car{
public void run() {
System.out.println("這是BYD");
}
}
public class Bentley implements Car{
public void run(){
System.out.println("這是Bentley");
}
}
4)測試用例
//通過統(tǒng)一的工廠洒放,傳入不同參數(shù)調(diào)用生產(chǎn)汽車的方法去生產(chǎn)不同品牌的車
public class Client {
public static void main(String[] args) {
Car benz= CarFactory.creatCar("Benz");
benz.run();
Car byd= CarFactory.creatCar("BYD");
byd.run();
Car bentley = CarFactory.creatCar("Bentley");
bentley.run();
}
}
2.1.2 結(jié)論
簡單工廠模式實(shí)現(xiàn)了生成產(chǎn)品類的代碼跟客戶端代碼分離,在工廠類中你可以添加所需的生成產(chǎn)品的邏輯代碼滨砍,但是問題來了往湿,優(yōu)秀的java代碼是符合“開放-封閉”原則的,也就是說對擴(kuò)展開發(fā)惋戏,對修改關(guān)閉领追,如果你要加一個產(chǎn)品類C,就要增加if-else判斷响逢,修改工廠類里面的生成產(chǎn)品的代碼绒窑。
2.2 工廠方法模式
- 工廠方法模式是對普通工廠方法模式的改進(jìn),在普通工廠方法模式中舔亭,如果傳遞的字符串出錯些膨,則不能正確創(chuàng)建對象,而工廠方法模式是提供多個工廠方法钦铺,分別創(chuàng)建對象订雾。
- 可以實(shí)現(xiàn)“開發(fā)-封閉”原則,無論加多少產(chǎn)品類职抡,我們都不用修改原來類中的代碼葬燎,而是通過增加工廠類來實(shí)現(xiàn)。但是這還是有缺點(diǎn)的,如果產(chǎn)品類過多谱净,我們就要生成很多的工廠類窑邦。
2.2.1. 和簡單工廠模式一樣,先定義一個接口壕探。再定義Benz冈钦、BYD和Bentley去實(shí)現(xiàn)這個接口
public interface Car{
public void run();
}
public class Benz implements Car{
public void run(){
System.out.println("這是Benz");
}
}
public class BYD implements Car{
public void run() {
System.out.println("這是BYD");
}
}
public class Bentley implements Car{
public void run(){
System.out.println("這是Bentley");
}
}
2.2.2. 定義工廠接口
public interface CarFactory {
public Car createCar();
}
2.2.3. 再分別定義BenzFactory、BYDFactory李请、BentleyFactory瞧筛,繼承剛剛定義的工廠接口
public class BenzFactory implements CarFactory {
public Car createCar(){
return new Benz();
}
}
public class BYDFactory implements CarFactory {
public Car createCar(){
return new BYD();
}
}
public class BentleyFactory implements CarFactory {
public Car createCar() {
return new Bentley();
}
}
2.2.4. 測試用例
// 客戶端代碼
public class Client {
public static void main(String[] args) {
//生產(chǎn)Benz
CarFactory benzFactory= new BenzFactory();
Car benz= benzFactory.createCar();
benz.run();
//生產(chǎn)BYD
CarFactory bydFactory = new BYDFactory();
Car byd= bydFactory.createCar();
byd.run();
//生產(chǎn)Bently
CarFactory bentleyFactory = new BentleyFactory();
Car bentley= bentleyFactory.createCar();
bentley.run();
}
}
2.3 抽象工廠模式
- 假如我們要實(shí)現(xiàn)的產(chǎn)品接口不止一個,也就是有多個產(chǎn)品接口导盅,不同產(chǎn)品接口有對應(yīng)的產(chǎn)品族较幌。什么是產(chǎn)品族呢?簡單的理解就是白翻,不同牌子產(chǎn)的車?yán)锩鏁信苘囶愋驼彝ヮ愋停逃妙愋偷鹊能嚶蒜桑煌谱拥能嚨呐苘囶愋偷能嚳梢越M成一個產(chǎn)品族岛琼。對于這種情況我們可以采用抽象工廠模式。
抽象工廠模式中包含的角色及職責(zé):
1.抽象工廠角色(Creator)
這是抽象工廠模式的核心巢株,任何工廠類必須實(shí)現(xiàn)這個接口槐瑞。
1.1 定義工廠接口
public interface CarFactory {
public SUVCar createSUVCar();
public SportsCar createSportsCar();
}
2.具體工廠角色(Concrete Creator)
2.1它是抽象工廠的一個實(shí)現(xiàn),負(fù)責(zé)實(shí)例化產(chǎn)品對象阁苞。
定義三個工廠類繼承上邊的接口并實(shí)現(xiàn)其方法
public class BenzFactory implements CarFactory {
public SUVCar createSUVCar(){
return new SUVBenz();
}
public SportsCar createSportsCar(){
return new SportsBenz();
}
}
public class BYDFactory implements CarFactory {
public SUVCar createSUVCar(){
return new SUVBYD();
}
public SportsCar createSportsCar(){
return new SportsBYD();
}
}
public class BentleyFactory implements CarFactory {
public SUVCar createSUVCar(){
return new SUVBentley();
}
public SportsCar createSportsCar(){
return new SportsBentley();
}
}
3.抽象角色(Product)
抽象工廠模式所創(chuàng)建的所有對象的父類困檩,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。
3.1 不同型號的汽車
public interface SUVCar {
public void run();
}
public interface SportsCar {
public void run();
}
4.具體產(chǎn)品角色(Concrete Product)
抽象工廠模式所創(chuàng)建的具體的實(shí)例對象猬错。
4.1 定義各個型號的汽車窗看,繼承剛剛定義的接口,實(shí)現(xiàn)其方法
public class SUVBenz implements SUVCar {
public void run() {
System.out.println("這是SUVBenz");
}
}
public class SportsBenz implements SportsCar {
public void run() {
System.out.println("這是SportsBenz");
}
}
public class SUVBYD implements SUVCar {
public void run() {
System.out.println("這是SUVBYD ");
}
}
public class SportsBYD implements SportsCar {
public void run() {
System.out.println("這是SportsBYD ");
}
}
public class SUVBentley implements SUVCar {
public void run() {
System.out.println("這是SUVBentley ");
}
}
public class SportsBentley implements SportsCar {
public void run() {
System.out.println("這是SportsBentley ");
}
}
5. 測試用例
public class Client {
public static void main(String[] args) {
//生產(chǎn)Benz
CarFactory benzFactory = new BenzFactory();
SUVCar suvBenz= benzFactory .createSUVCar();
SportsCar sportsBenz = benzFactory .createSportsCar();
suvBenz.run();
sportsBenz.run();
//生產(chǎn)BYD
CarFactory bydFactory = new BYDFactory();
SUVCar suvBYD = bydFactory.createSUVCar();
SportsCar sportsBYD = bydFactory.createSportsCar();
suvBYD.run();
sportsBYD.run();
//生產(chǎn)Bentley
CarFactory bentleyFactory = new BentleyFactory();
SUVCar suvBentley= bentleyFactory .createSUVCar();
SportsCar sportsBentley = bentleyFactory .createSportsCar();
suvBentley.run();
sportsBentley.run();
}
}
6. 結(jié)論
- 簡單工廠模式:工廠類是整個模式的關(guān)鍵所在倦炒,包含了必要的邏輯判斷显沈,能夠外界給定的信息, 決定究竟創(chuàng)建哪個具體類的對象逢唤。
- 工廠方法模式:是對簡單工廠方法模式的一個抽象拉讯,抽離出了一個Factory類(或者接口),這個接口不負(fù)責(zé)具體產(chǎn)品的生產(chǎn)鳖藕,而只是指定一些規(guī)范魔慷,具體的生產(chǎn)工作由其子類去完成。這個模式中著恩,工廠類和產(chǎn)品類往往是一一對應(yīng)的院尔,完全解決了簡單工廠模式中違背“開閉原則”的問題蜻展,實(shí)現(xiàn)了可擴(kuò)展;
- 抽象工廠模式 :存在多個抽象產(chǎn)品類邀摆,每個抽象產(chǎn)品類可以派生出多個具體產(chǎn)品類纵顾,工廠提供多種方法,去生產(chǎn)“系列”產(chǎn)品栋盹。