Java創(chuàng)建型設(shè)計(jì)模式之工廠方法模式深入詳解
簡(jiǎn)單工廠模式
簡(jiǎn)單工廠模式(Simple Factory Pattern)是指由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例,但是它不屬于設(shè)計(jì)模式。
簡(jiǎn)單工廠適用于工廠類負(fù)責(zé)創(chuàng)建的對(duì)象較少的場(chǎng)景,且客戶端只需要傳入工廠類的參數(shù),對(duì)于如何創(chuàng)建對(duì)象的邏輯不需要關(guān)心。
定義產(chǎn)品對(duì)象
public interface ICar { void create(); } public class BMCar implements ICar{ @Override public void create(){ System.out.println("制造BM車"); } } public class ADCar implements ICar { @Override public void create() { System.out.println("制造AD車"); } }
創(chuàng)建工廠類
創(chuàng)建一個(gè)實(shí)現(xiàn)工廠類,所有的對(duì)象交由該工廠類創(chuàng)建
public class CarFactory { public ICar create(ICar car) { if (car instanceof BMCar) { return new BMCar(); } else if (car instanceof ADCar) { return new ADCar(); } else { return null; } } } public static void main(String[] args) { CarFactory carFactory = new CarFactory(); ICar bm = carFactory.create(new BMCar()); bm.create(); ICar ad = carFactory.create(new ADCar()); ad.create(); }
工廠使用反射
上述方式隨著業(yè)務(wù)擴(kuò)展,就需要修改createAnimal方法中的邏輯代碼,不符合開閉原則。
可使用反射技術(shù),即使業(yè)務(wù)變化擴(kuò)展,也不需要修改AnimalFactory中的邏輯代碼
public class CarFactory { public ICar create(String className) { try { if (!(null == className || "".equals(className))) { return (ICar) Class.forName(className).newInstance(); } } catch (Exception e) { e.printStackTrace(); } return null; } } public static void main(String[] args) { CarFactory carFactory = new CarFactory(); ICar bm = carFactory.create("cn.ybzy.demo.BMCar"); bm.create(); }
上述方式的缺點(diǎn)是方法參數(shù)是字符串,有著不可控的風(fēng)險(xiǎn)。可進(jìn)一步優(yōu)化,使用強(qiáng)制類型限制,控制參數(shù)傳遞
public class CarFactory { public ICar create(Class<? extends ICar> clazz) { try { if (!(null == clazz)) { return clazz.newInstance(); } } catch (Exception e) { e.printStackTrace(); } return null; } } public static void main(String[] args) { CarFactory carFactory = new CarFactory(); ICar bm = carFactory.create(BMCar.class); bm.create(); }
工廠方法模式
概述
工廠方法模式是簡(jiǎn)單工廠模式的衍生,解決了許多簡(jiǎn)單工廠模式的問題。工廠方法模式屬于創(chuàng)建型模式。
工廠模式(Factory Pattern)是Java中最常用的設(shè)計(jì)模式之一。它提供了一種創(chuàng)建對(duì)象的最佳方式。
它定義一個(gè)創(chuàng)建對(duì)象的接口,讓其子類自己決定實(shí)例化哪一個(gè)工廠類,工廠模式使其創(chuàng)建過程延遲到子類進(jìn)行。
在工廠方法模式中只需要關(guān)心所需產(chǎn)品對(duì)應(yīng)的工廠,無須關(guān)心創(chuàng)建細(xì)節(jié),而且加入新的產(chǎn)品符合開閉原則。
應(yīng)用場(chǎng)景
1.創(chuàng)建對(duì)象需要大量重復(fù)的代碼。
2.客戶端(應(yīng)用層)不依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、實(shí)現(xiàn)等細(xì)節(jié)。
3.一個(gè)類通過其子類來指定創(chuàng)建哪個(gè)對(duì)象。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1.一個(gè)調(diào)用者想創(chuàng)建一個(gè)對(duì)象,只需要知道其名稱就可以
2.擴(kuò)展性高,如果想增加一個(gè)產(chǎn)品,只需要擴(kuò)展一個(gè)工廠類
3.屏蔽產(chǎn)品的具體實(shí)現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口
缺點(diǎn):
1.每增加一個(gè)產(chǎn)品時(shí),都需要增加一個(gè)具體類和對(duì)象實(shí)現(xiàn)工廠,使系統(tǒng)中類的個(gè)數(shù)成倍增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,同時(shí)也增加了系統(tǒng)具體類的依賴。
主要角色
1.抽象產(chǎn)品角色(Product)
工廠方法模式所創(chuàng)建的對(duì)象的超類型,也就是產(chǎn)品對(duì)象的共同父類或共同擁有的接口。
2.具體產(chǎn)品角色(Concrete Product)
這個(gè)角色實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口。某具體產(chǎn)品有專門的具體工廠創(chuàng)建,它們之間往往一一對(duì)應(yīng)。
3.抽象工廠角色(Creator)
是工廠方法模式的核心,與應(yīng)用程序無關(guān)。任何在模式中創(chuàng)建的對(duì)象的工廠類必須實(shí)現(xiàn)這個(gè)接口。
4.具體工廠角色(Concrete Creator)
這是實(shí)現(xiàn)抽象工廠接口的具體工廠類,包含與應(yīng)用程序密切相關(guān)的邏輯,并且受到應(yīng)用程序調(diào)用以創(chuàng)建產(chǎn)品對(duì)象。
工廠方法模式的基本使用
創(chuàng)建抽象產(chǎn)品
創(chuàng)建抽象產(chǎn)品角色,工廠類所創(chuàng)建的產(chǎn)品的父類,封裝了產(chǎn)品對(duì)象的公共方法
public abstract class AbstractCar { public abstract void run(); }
創(chuàng)建具體產(chǎn)品
public class Car extends AbstractCar { public void run() { System.out.println("Car run"); } }
創(chuàng)建抽象工廠
public abstract class ICarFactory { public abstract <T> T create(Class<T> clazz); }
創(chuàng)建具體工廠
創(chuàng)建多個(gè)實(shí)現(xiàn)抽象工廠接口的具體工廠類。負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建產(chǎn)品的內(nèi)部邏輯,該工廠類可以被直接調(diào)用,創(chuàng)建所需的具體對(duì)象。
public class CarFactory extends ICarFactory { @Override public <T> T create(Class<T> clazz) { Car car; try { car = (Car) Class.forName(clazz.getName()).getConstructor().newInstance(); } catch (Exception e) { throw new RuntimeException(e); } return (T) car; } }
客戶端執(zhí)行
通過一個(gè)工廠類,對(duì)實(shí)現(xiàn)了同一接口的一些類進(jìn)行實(shí)例的創(chuàng)建
public static void main(String[] args) { ICarFactory factory = new CarFactory(); Car car = factory.create(Car.class); car.run(); }
Car run
到此這篇關(guān)于Java創(chuàng)建型設(shè)計(jì)模式之工廠方法模式深入詳解的文章就介紹到這了,更多相關(guān)Java工廠方法模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring4.3 實(shí)現(xiàn)跨域CORS的方法
下面小編就為大家分享一篇spring4.3 實(shí)現(xiàn)跨域CORS的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01RabbitMq消息防丟失功能實(shí)現(xiàn)方式講解
這篇文章主要介紹了RabbitMq消息防丟失功能實(shí)現(xiàn),RabbitMQ中,消息丟失可以簡(jiǎn)單的分為兩種:客戶端丟失和服務(wù)端丟失。針對(duì)這兩種消息丟失,RabbitMQ都給出了相應(yīng)的解決方案2023-01-01Java實(shí)現(xiàn)的zip工具類完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的zip工具類,結(jié)合完整實(shí)例形式分析了Java針對(duì)zip文件指定路徑壓縮、遞歸壓縮等相關(guān)操作技巧,需要的朋友可以參考下2018-12-12java調(diào)用webservice接口,并解析返回參數(shù)問題
這篇文章主要介紹了java調(diào)用webservice接口,并解析返回參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07SpringBoot使用AES對(duì)JSON數(shù)據(jù)加密和解密的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringBoot使用AES對(duì)JSON數(shù)據(jù)加密和解密的實(shí)現(xiàn)方法,文章通過代碼示例介紹的非常詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-08-08Springboot實(shí)現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場(chǎng)景)
這篇文章主要介紹了Springboot實(shí)現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場(chǎng)景),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11