Java工廠模式優(yōu)雅地創(chuàng)建對(duì)象以及提高代碼復(fù)用率和靈活性
介紹
Java工廠設(shè)計(jì)模式主要分為三種:
簡(jiǎn)單工廠模式(Simple Factory Pattern):使用一個(gè)工廠類來(lái)封裝對(duì)象創(chuàng)建的過(guò)程,客戶端只需要通過(guò)傳遞不同的參數(shù)來(lái)獲取不同的產(chǎn)品對(duì)象,從而避免了客戶端直接創(chuàng)建產(chǎn)品對(duì)象的操作
工廠方法模式(Factory Method Pattern):將工廠類抽象出來(lái),每個(gè)具體產(chǎn)品類對(duì)應(yīng)一個(gè)具體工廠類,工廠類通過(guò)多態(tài)性來(lái)創(chuàng)建對(duì)應(yīng)的產(chǎn)品對(duì)象,客戶端只需要知道工廠接口及其實(shí)現(xiàn)類即可,可以根據(jù)需求動(dòng)態(tài)切換工廠實(shí)現(xiàn),擴(kuò)展性更好.
抽象工廠模式(Abstract Factory Pattern):在工廠方法模式的基礎(chǔ)上,將工廠類再進(jìn)行一次抽象,將多個(gè)工廠接口放到一個(gè)工廠接口中,每個(gè)具體產(chǎn)品對(duì)應(yīng)一個(gè)具體工廠類,通過(guò)多態(tài)性來(lái)創(chuàng)建對(duì)應(yīng)的產(chǎn)品對(duì)象,具有更好的擴(kuò)展性和更高的抽象程度,但是也增加了系統(tǒng)復(fù)雜度
簡(jiǎn)單工廠模式
首先先定義一個(gè)抽象產(chǎn)品類:
package com.fanqiechaodan.factory.simple.product; /** * @Classname Product * @Description 抽象產(chǎn)品類 */ public abstract class Product { public abstract void use(); }
然后定義具體產(chǎn)品類
public class ProductA extends Product{ @Override public void use() { System.out.println("使用具體產(chǎn)品類A..."); } } public class ProductB extends Product{ @Override public void use() { System.out.println("使用具體產(chǎn)品類B..."); } } public class ProductC extends Product{ @Override public void use() { System.out.println("使用具體產(chǎn)品類C..."); } }
接下來(lái)定義工廠類,用于創(chuàng)建不同的產(chǎn)品
package com.fanqiechaodan.factory.simple.factory; import com.fanqiechaodan.factory.simple.product.Product; import com.fanqiechaodan.factory.simple.product.ProductA; import com.fanqiechaodan.factory.simple.product.ProductB; import com.fanqiechaodan.factory.simple.product.ProductC; /** * @Classname SimpleFactory * @Description 工廠類 */ public class SimpleFactory { public static Product createProduct(String type) { switch (type) { case "A": return new ProductA(); case "B": return new ProductB(); case "C": return new ProductC(); default: throw new RuntimeException("不支持的產(chǎn)品類型:" + type); } } }
測(cè)試:
package com.fanqiechaodan.factory.simple; import com.fanqiechaodan.factory.simple.factory.SimpleFactory; import com.fanqiechaodan.factory.simple.product.Product; /** * @Classname Demo * @Description 簡(jiǎn)單工廠模式 */ public class Demo { public static void main(String[] args) { Product productA = SimpleFactory.createProduct("A"); productA.use(); Product productB = SimpleFactory.createProduct("B"); productB.use(); Product productC = SimpleFactory.createProduct("C"); productC.use(); Product productD = SimpleFactory.createProduct("D"); productD.use(); } }
工廠方法模式
首先定義一個(gè)接口表示產(chǎn)品
package com.fanqiechaodan.factory.method.product; /** * @Classname Product * @Description 產(chǎn)品接口 */ public interface Product { void use(); }
其次定義兩個(gè)具體的產(chǎn)品實(shí)現(xiàn)類
public class ProductA implements Product{ @Override public void use() { System.out.println("使用具體產(chǎn)品A..."); } } public class ProductB implements Product{ @Override public void use() { System.out.println("使用具體產(chǎn)品B..."); } }
然后定義一個(gè)工廠接口用于創(chuàng)建產(chǎn)品
package com.fanqiechaodan.factory.method.factory; import com.fanqiechaodan.factory.method.product.Product; /** * @Classname Factory * @Description 工廠接口 */ public interface Factory { Product createProduct(); }
接下來(lái),定義兩個(gè)具體的工廠實(shí)現(xiàn)類,分別用于創(chuàng)建不同的產(chǎn)品
public class FactoryA implements Factory{ @Override public Product createProduct() { return new ProductA(); } } public class FactoryB implements Factory{ @Override public Product createProduct() { return new ProductB(); } }
測(cè)試
package com.fanqiechaodan.factory.method.factory; import com.fanqiechaodan.factory.method.product.Product; import com.fanqiechaodan.factory.method.product.ProductB; /** * @Classname FactoryB * @Description 工廠實(shí)現(xiàn)類B */ public class FactoryB implements Factory{ @Override public Product createProduct() { return new ProductB(); } }
抽象工廠模式
首先定義抽象產(chǎn)品
public interface ProductA { void doSomething(); } public interface ProductB { void doSomething(); }
其次定義具體產(chǎn)品
public class ProductA1 implements ProductA{ @Override public void doSomething() { System.out.println("ProductA1 doSomething ..."); } } public class ProductA2 implements ProductA{ @Override public void doSomething() { System.out.println("ProductA2 doSomething ..."); } } public class ProductB1 implements ProductB{ @Override public void doSomething() { System.out.println("ProductB1 doSomething ..."); } } public class ProductB2 implements ProductB{ @Override public void doSomething() { System.out.println("ProductB2 doSomething ..."); } }
然后定義抽象工廠
package com.fanqiechaodan.factory.abstractfactory.factory; import com.fanqiechaodan.factory.abstractfactory.product.ProductA; import com.fanqiechaodan.factory.abstractfactory.product.ProductB; /** * @Classname AbstractFactory * @Description 抽象工廠 */ public interface AbstractFactory { ProductA createProductA(); ProductB createProductB(); }
接下來(lái)定義具體工廠
public class Factory1 implements AbstractFactory{ @Override public ProductA createProductA() { return new ProductA1(); } @Override public ProductB createProductB() { return new ProductB1(); } } public class Factory2 implements AbstractFactory{ @Override public ProductA createProductA() { return new ProductA2(); } @Override public ProductB createProductB() { return new ProductB2(); } }
測(cè)試
package com.fanqiechaodan.factory.abstractfactory; import com.fanqiechaodan.factory.abstractfactory.factory.AbstractFactory; import com.fanqiechaodan.factory.abstractfactory.factory.Factory1; import com.fanqiechaodan.factory.abstractfactory.factory.Factory2; import com.fanqiechaodan.factory.abstractfactory.product.ProductA; import com.fanqiechaodan.factory.abstractfactory.product.ProductB; /** * @Classname Demo * @Description 抽象工廠模式 */ public class Demo { public static void main(String[] args) { // 使用具體工廠1創(chuàng)建產(chǎn)品A和產(chǎn)品B AbstractFactory factory1 = new Factory1(); ProductA productA1 = factory1.createProductA(); ProductB productB1 = factory1.createProductB(); productA1.doSomething(); productB1.doSomething(); // 使用具體工廠2創(chuàng)建產(chǎn)品A和產(chǎn)品B AbstractFactory factory2 = new Factory2(); ProductA productA2 = factory2.createProductA(); ProductB productB2 = factory2.createProductB(); productA2.doSomething(); productB2.doSomething(); } }
總結(jié)
簡(jiǎn)單工廠模式
優(yōu)點(diǎn):
- 簡(jiǎn)單易用,客戶端只需要知道工廠類和產(chǎn)品類即可
- 工廠類負(fù)責(zé)創(chuàng)建對(duì)象,客戶端無(wú)需知道具體得實(shí)現(xiàn)細(xì)節(jié)
- 可以根據(jù)參數(shù)動(dòng)態(tài)創(chuàng)建對(duì)象
缺點(diǎn):
- 工廠類負(fù)責(zé)創(chuàng)建所有得產(chǎn)品對(duì)象,當(dāng)產(chǎn)品類型過(guò)多時(shí),工廠類會(huì)變得十分臃腫
- 添加新產(chǎn)品需要修改工廠類的代碼,違反了開(kāi)閉原則
工廠方法模式
優(yōu)點(diǎn):
- 將每個(gè)產(chǎn)品類型的創(chuàng)建部分分散到具體的工廠類中,避免了簡(jiǎn)單工廠模式中工廠類臃腫的問(wèn)題
- 添加新產(chǎn)品只需要添加具體工廠類即可,符合開(kāi)閉原則
缺點(diǎn):
- 客戶端需要知道所有具體工廠類,使用起來(lái)不夠靈活
- 每個(gè)產(chǎn)品類型都需要對(duì)應(yīng)一個(gè)具體的工廠類,增加了系統(tǒng)類的個(gè)數(shù),增加了系統(tǒng)的復(fù)雜度
抽象工廠模式
優(yōu)點(diǎn):
- 可以創(chuàng)建一組相關(guān)的產(chǎn)品對(duì)象,確保這些對(duì)象之間的兼容性
- 隱藏了產(chǎn)品對(duì)象的具體實(shí)現(xiàn),客戶端只需要知道抽象工廠和抽象產(chǎn)品即可
- 可以通過(guò)替換具體工廠來(lái)實(shí)現(xiàn)不同的產(chǎn)品組合,提高了系統(tǒng)的靈活性
缺點(diǎn);
- 增加了系統(tǒng)的抽象性和復(fù)雜度,需要定義多個(gè)抽象工廠接口和多個(gè)具體工廠類
- 不容易支持新種類的產(chǎn)品,需要添加新的產(chǎn)品工廠接口和具體工廠類
到此這篇關(guān)于Java工廠模式優(yōu)雅地創(chuàng)建對(duì)象以及提高代碼復(fù)用率和靈活性的文章就介紹到這了,更多相關(guān)Java工廠模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用PropertiesLauncher加載外部jar包
這篇文章主要介紹了SpringBoot使用PropertiesLauncher加載外部jar包,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07Java中Prime算法的原理與實(shí)現(xiàn)詳解
Prime算法是一種窮舉查找算法來(lái)從一個(gè)連通圖中構(gòu)造一棵最小生成樹(shù)。本文主要為大家介紹了Java中Prime算法的原理與實(shí)現(xiàn),感興趣的可以學(xué)習(xí)一下2022-07-07詳解Java的JDBC中Statement與PreparedStatement對(duì)象
這篇文章主要介紹了詳解Java的JDBC中Statement與PreparedStatement對(duì)象,PreparedStatement一般來(lái)說(shuō)比使用Statement效率更高,需要的朋友可以參考下2015-12-12JAVA加密算法數(shù)字簽名實(shí)現(xiàn)原理詳解
這篇文章主要介紹了JAVA加密算法數(shù)字簽名實(shí)現(xiàn)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10關(guān)于feign對(duì)x-www-form-urlencode類型的encode和decode問(wèn)題
這篇文章主要介紹了關(guān)于feign對(duì)x-www-form-urlencode類型的encode和decode問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03SharedingSphere?自定義脫敏規(guī)則介紹
這篇文章主要介紹了SharedingSphere?自定義脫敏規(guī)則,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12java連接orcale數(shù)據(jù)庫(kù)示例分享
這篇文章主要介紹了java連接orcale數(shù)據(jù)庫(kù)示例,需要的朋友可以參考下2014-02-02