寶安做棋牌網(wǎng)站建設(shè)哪家公司收費(fèi)合理天津優(yōu)化加盟
工廠模式
工廠設(shè)計(jì)模式是一種創(chuàng)建型設(shè)計(jì)模式,它提供了一種封裝對(duì)象創(chuàng)建過程的機(jī)制,將對(duì)象的創(chuàng)建與使用分離。
這種設(shè)計(jì)模式允許我們?cè)诓恍薷目蛻舳舜a的情況下引入新的對(duì)象類型。
在Java中,工廠設(shè)計(jì)模式主要有三種形式:簡(jiǎn)單工廠模式、工廠方法模式和抽象工廠模式。
簡(jiǎn)單工廠模式
用來生成同一等級(jí)結(jié)構(gòu)中的任意產(chǎn)品。
注:對(duì)增加新的產(chǎn)品需要修改已有的代碼,這違背了面向?qū)ο笤O(shè)計(jì)原則中的開閉原則(對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉)
UML
實(shí)現(xiàn)代碼
Animal.java
// 定義一個(gè)動(dòng)物的接口
public interface Animal {// 接口中定義一個(gè)抽象的方法:叫聲void makeSound();
}
Cat.java
// 定義一個(gè)實(shí)現(xiàn)類實(shí)現(xiàn)Animal接口
public class Cat implements Animal{// 貓屬于動(dòng)物:實(shí)現(xiàn)發(fā)出叫聲的接口@Overridepublic void makeSound() {System.out.println("喵喵喵");}
}
Dog.java
// 定義一個(gè)實(shí)現(xiàn)類實(shí)現(xiàn)Animal接口
public class Dog implements Animal{// 狗屬于動(dòng)物:實(shí)現(xiàn)發(fā)出叫聲的接口@Overridepublic void makeSound() {System.out.println("汪汪汪");}
}
SimpleAnimalFactory.java
// 定義一個(gè)簡(jiǎn)單工廠類用于創(chuàng)建動(dòng)物
public class SimpleAnimalFactory {// 定義一個(gè)創(chuàng)建動(dòng)物的方法用于生產(chǎn)不同的動(dòng)物的靜態(tài)方法public static Animal createAnimal(String type) {if ("Cat".equalsIgnoreCase(type)) {return new Cat();}else if ("Dog".equalsIgnoreCase(type)) {return new Dog();}else {return null;}}
}
TestClient.java
public class TestClient {public static void main(String[] args) {// 根據(jù)簡(jiǎn)單工廠創(chuàng)建不同的動(dòng)物,執(zhí)行動(dòng)作// 生產(chǎn)一個(gè)CatAnimal cat = SimpleAnimalFactory.createAnimal("cat");cat.makeSound();// 生產(chǎn)一個(gè)DogAnimal dog = SimpleAnimalFactory.createAnimal("Dog");dog.makeSound();}
}
執(zhí)行結(jié)果:
結(jié)論:
簡(jiǎn)單工廠好處在于,對(duì)于客戶端調(diào)用時(shí),我們不需要關(guān)心具體實(shí)現(xiàn),只需要調(diào)用工廠方法,傳入?yún)?shù)獲取我們需要返回的結(jié)果即可。
但是對(duì)于同一個(gè)產(chǎn)品(動(dòng)物),如果我們進(jìn)行新增(豬),則必須要修改Factory中createAnimal(String type)方法。因此違背了開閉原則
工廠方法模式
用來生產(chǎn)同一等級(jí)結(jié)構(gòu)中的固定產(chǎn)品。
支持增加任意產(chǎn)品,滿足開閉原則,但設(shè)計(jì)相對(duì)于簡(jiǎn)單工廠復(fù)雜一些
UML
實(shí)現(xiàn)代碼
Product.java
// 定義一個(gè)產(chǎn)品接口
public interface Product {//定義一個(gè)抽象的使用的方法void use();
}
ProductA.java
// ProductA實(shí)現(xiàn)Product接口
public class ProductA implements Product{@Overridepublic void use() {System.out.println("ProductA 使用了");}
}
ProductB.java
// ProductB實(shí)現(xiàn)Product接口
public class ProductB implements Product{@Overridepublic void use() {System.out.println("ProductB 使用了");}
}
ProductFactory.java
// 定義一個(gè)ProductFactory工廠接口
public interface ProductFactory {// 接口中定義一個(gè)創(chuàng)建Product的方法Product createProduct();
}
ProductAFactory.java
// 創(chuàng)建一個(gè)ProductA的工廠,實(shí)現(xiàn)ProductFactory接口,用于生產(chǎn)ProductA
public class ProductAFactory implements ProductFactory{@Overridepublic Product createProduct() {return new ProductA();}
}
ProductBFactory.java
// 創(chuàng)建一個(gè)ProductB的工廠,實(shí)現(xiàn)ProductFactory接口,用于生產(chǎn)ProductB
public class ProductBFactory implements ProductFactory{@Overridepublic Product createProduct() {return new ProductB();}
}
TestClient.java
public class TestClient {public static void main(String[] args) {// 創(chuàng)建ProductAProduct product1 = new ProductAFactory().createProduct();product1.use();// 創(chuàng)建ProductBProduct product2 = new ProductBFactory().createProduct();product2.use();}
}
執(zhí)行結(jié)果:
從工廠方式模式,我們可以看出,我們可以任意增加同一產(chǎn)品,而不會(huì)影響到原來已有產(chǎn)品
(創(chuàng)建一個(gè)產(chǎn)品C繼承Product接口,創(chuàng)建一個(gè)產(chǎn)品C的Factory類生產(chǎn)C,使用是通過相應(yīng)Factory調(diào)用生產(chǎn)C即可)。
如果產(chǎn)品中新增一個(gè)方法,則所有實(shí)現(xiàn)了Product接口的方法都必須修改相應(yīng)方法。
抽象工廠模式
用來生產(chǎn)不同產(chǎn)品族的全部產(chǎn)品。
對(duì)增加新的產(chǎn)品無能為力,支持增加產(chǎn)品族
UML
實(shí)現(xiàn)代碼
Engine.java
// 定義發(fā)動(dòng)機(jī)接口
public interface Engine {// 定義發(fā)動(dòng)機(jī) 發(fā)動(dòng)方法void run();// 定義發(fā)動(dòng)機(jī) 停止方法void stop();
}
HighEndEngine.java
// 創(chuàng)建一個(gè)高端發(fā)動(dòng)機(jī)實(shí)現(xiàn)發(fā)動(dòng)機(jī)
public class HighEndEngine implements Engine{@Overridepublic void run() {System.out.println("高端發(fā)動(dòng)機(jī)-跑的快");}@Overridepublic void stop() {System.out.println("高端發(fā)動(dòng)機(jī)-剎車性能強(qiáng)");}
}
LowEndEngine.java
// 創(chuàng)建一個(gè)低端發(fā)動(dòng)機(jī)實(shí)現(xiàn)發(fā)動(dòng)機(jī)
public class LowEndEngine implements Engine{@Overridepublic void run() {System.out.println("低端發(fā)動(dòng)機(jī)-跑的慢");}@Overridepublic void stop() {System.out.println("低端發(fā)動(dòng)機(jī)-剎車性能弱");}
}
CarBody.java
// 定義一個(gè)車身接口
public interface CarBody {// 定義一個(gè)乘坐的方法void ride();
}
HighEndCarBody.java
// 創(chuàng)建一個(gè)高端車身實(shí)現(xiàn)車身
public class HighEndCarBody implements CarBody{@Overridepublic void ride() {System.out.println("高端車身-奢華-安全");}
}
LowEndCarBody.java
// 創(chuàng)建一個(gè)低端車身實(shí)現(xiàn)車身
public class LowEndCarBody implements CarBody{@Overridepublic void ride() {System.out.println("低端車身-樸素-看起來安全");}
}
Tyre.java
// 定義一個(gè)輪胎接口
public interface Tyre {// 定義輪胎轉(zhuǎn)動(dòng)的方法void run();
}
HighEndTyre.java
// 創(chuàng)建一個(gè)高端輪胎實(shí)現(xiàn)輪胎
public class HighEndTyre implements Tyre{@Overridepublic void run() {System.out.println("高端輪胎-太空材料-安全-耐磨");}
}
LowEndTyre.java
// 創(chuàng)建一個(gè)低端輪胎實(shí)現(xiàn)輪胎
public class LowEndTyre implements Tyre{@Overridepublic void run() {System.out.println("低端輪胎-普通材料-易磨損");}
}
CarFactory.java
// 定義Car的接口
public interface CarFactory {// 創(chuàng)建發(fā)動(dòng)機(jī)Engine engine();// 創(chuàng)建車身CarBody carBody();// 創(chuàng)建輪胎Tyre tyre();
}
HighEndCarBody.java
// 高端汽車工廠實(shí)現(xiàn)汽車工廠
public class HighEndCarFactory implements CarFactory{@Overridepublic Engine engine() {return new HighEndEngine();}@Overridepublic CarBody carBody() {return new HighEndCarBody();}@Overridepublic Tyre tyre() {return new HighEndTyre();}
}
LowEndCarFactory.java
// 低端汽車工廠實(shí)現(xiàn)汽車工廠
public class LowEndCarFactory implements CarFactory{@Overridepublic Engine engine() {return new LowEndEngine();}@Overridepublic CarBody carBody() {return new LowEndCarBody();}@Overridepublic Tyre tyre() {return new LowEndTyre();}
}
TestClient.java
public class TestClient {public static void main(String[] args) {// 使用高端汽車工廠類 創(chuàng)建高端汽車HighEndCarFactory highEndCar = new HighEndCarFactory();highEndCar.engine().stop();highEndCar.carBody().ride();highEndCar.tyre().run();System.out.println("==========================");// 使用低端汽車工廠類 創(chuàng)建低端汽車LowEndCarFactory lowEndCar = new LowEndCarFactory();lowEndCar.engine().stop();lowEndCar.carBody().ride();lowEndCar.tyre().run();}
}
執(zhí)行結(jié)果:
抽象工廠,不可以增加產(chǎn)品(比如:CarFactory一旦定下了,如果我們要新增新的部件則所有實(shí)現(xiàn)CarFactory的類都需實(shí)現(xiàn)該方法)。
但是抽象工廠,可以根據(jù)已有的接口,創(chuàng)建更多的產(chǎn)品族(比如:定義一個(gè)中端汽車工廠,調(diào)用高端發(fā)動(dòng)機(jī),低端輪胎,低端車身,等任意組合成新的Factory)
對(duì)比及應(yīng)用場(chǎng)景
簡(jiǎn)單工廠模式
- 優(yōu)點(diǎn):
- 實(shí)現(xiàn)了對(duì)象的創(chuàng)建和使用的責(zé)任分割,客戶端只需要傳入正確的參數(shù),就可以獲取需要的對(duì)象,無需知道創(chuàng)建細(xì)節(jié)。
- 工廠類中有必要的判斷邏輯,可以決定根據(jù)當(dāng)前的參數(shù)創(chuàng)建對(duì)應(yīng)的產(chǎn)品實(shí)例,客戶端可以免除直接創(chuàng)建產(chǎn)品對(duì)象的責(zé)任。
- 缺點(diǎn):
- 工廠類職責(zé)過重,如果產(chǎn)品種類增加,工廠類的代碼會(huì)變得龐大且復(fù)雜,不利于維護(hù)。
- 簡(jiǎn)單工廠模式違背了開放封閉原則,因?yàn)槊看卧黾有庐a(chǎn)品時(shí),都需要修改工廠類的代碼。
- 適用場(chǎng)景:
- 創(chuàng)建對(duì)象較少,且對(duì)象的創(chuàng)建邏輯不復(fù)雜時(shí)。
- 客戶端不關(guān)心對(duì)象的創(chuàng)建過程,只關(guān)心使用對(duì)象時(shí)。
工廠方法模式
- 優(yōu)點(diǎn):
- 將對(duì)象的創(chuàng)建推遲到子類中進(jìn)行,使得類的實(shí)例化更加靈活和可擴(kuò)展。
- 降低了客戶端與具體產(chǎn)品類之間的耦合度,客戶端只需要知道對(duì)應(yīng)的工廠,無需知道具體的產(chǎn)品類。
- 缺點(diǎn):
- 增加了系統(tǒng)的抽象性和理解難度,需要引入額外的工廠接口和工廠類。
- 如果產(chǎn)品類較少,使用工廠方法模式可能會(huì)增加不必要的復(fù)雜性。
- 適用場(chǎng)景:
- 需要?jiǎng)?chuàng)建大量相似對(duì)象時(shí),可以使用工廠方法模式來簡(jiǎn)化對(duì)象的創(chuàng)建過程。
- 當(dāng)一個(gè)類需要由其子類來指定創(chuàng)建哪個(gè)對(duì)象時(shí),可以使用工廠方法模式。
- 但實(shí)際開發(fā)中,簡(jiǎn)單工廠比工廠方法使用的更多
抽象工廠模式
- 優(yōu)點(diǎn):
- 提供了創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,無需指定它們具體的類。
- 增加了系統(tǒng)的靈活性和可擴(kuò)展性,可以通過更換不同的工廠來實(shí)現(xiàn)不同的產(chǎn)品族。
- 缺點(diǎn):
- 規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合,產(chǎn)品族中擴(kuò)展新的產(chǎn)品困難。
- 如果產(chǎn)品族中的產(chǎn)品較少,使用抽象工廠模式可能會(huì)導(dǎo)致代碼冗余和復(fù)雜性增加。
- 適用場(chǎng)景:
- 當(dāng)需要?jiǎng)?chuàng)建一組相互關(guān)聯(lián)或相互依賴的對(duì)象時(shí),可以使用抽象工廠模式。
- 當(dāng)一個(gè)系統(tǒng)需要獨(dú)立地變化其創(chuàng)建的對(duì)象時(shí),抽象工廠模式是一個(gè)很好的選擇。
gitee源碼
git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git