Java創(chuàng)建型設(shè)計模式之工廠方法模式深入詳解
簡單工廠模式
簡單工廠模式(Simple Factory Pattern)是指由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實例,但是它不屬于設(shè)計模式。
簡單工廠適用于工廠類負(fù)責(zé)創(chuàng)建的對象較少的場景,且客戶端只需要傳入工廠類的參數(shù),對于如何創(chuàng)建對象的邏輯不需要關(guān)心。
定義產(chǎn)品對象
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)建一個實現(xiàn)工廠類,所有的對象交由該工廠類創(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)險??蛇M(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(); }
工廠方法模式
概述
工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。工廠方法模式屬于創(chuàng)建型模式。
工廠模式(Factory Pattern)是Java中最常用的設(shè)計模式之一。它提供了一種創(chuàng)建對象的最佳方式。
它定義一個創(chuàng)建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創(chuàng)建過程延遲到子類進(jìn)行。
在工廠方法模式中只需要關(guān)心所需產(chǎn)品對應(yīng)的工廠,無須關(guān)心創(chuàng)建細(xì)節(jié),而且加入新的產(chǎn)品符合開閉原則。
應(yīng)用場景
1.創(chuàng)建對象需要大量重復(fù)的代碼。
2.客戶端(應(yīng)用層)不依賴于產(chǎn)品類實例如何被創(chuàng)建、實現(xiàn)等細(xì)節(jié)。
3.一個類通過其子類來指定創(chuàng)建哪個對象。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1.一個調(diào)用者想創(chuàng)建一個對象,只需要知道其名稱就可以
2.擴(kuò)展性高,如果想增加一個產(chǎn)品,只需要擴(kuò)展一個工廠類
3.屏蔽產(chǎn)品的具體實現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口
缺點(diǎn):
1.每增加一個產(chǎn)品時,都需要增加一個具體類和對象實現(xiàn)工廠,使系統(tǒng)中類的個數(shù)成倍增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,同時也增加了系統(tǒng)具體類的依賴。
主要角色
1.抽象產(chǎn)品角色(Product)
工廠方法模式所創(chuàng)建的對象的超類型,也就是產(chǎn)品對象的共同父類或共同擁有的接口。
2.具體產(chǎn)品角色(Concrete Product)
這個角色實現(xiàn)了抽象產(chǎn)品角色所定義的接口。某具體產(chǎn)品有專門的具體工廠創(chuàng)建,它們之間往往一一對應(yīng)。
3.抽象工廠角色(Creator)
是工廠方法模式的核心,與應(yīng)用程序無關(guān)。任何在模式中創(chuàng)建的對象的工廠類必須實現(xiàn)這個接口。
4.具體工廠角色(Concrete Creator)
這是實現(xiàn)抽象工廠接口的具體工廠類,包含與應(yīng)用程序密切相關(guān)的邏輯,并且受到應(yīng)用程序調(diào)用以創(chuàng)建產(chǎn)品對象。
工廠方法模式的基本使用
創(chuàng)建抽象產(chǎn)品
創(chuàng)建抽象產(chǎn)品角色,工廠類所創(chuàng)建的產(chǎn)品的父類,封裝了產(chǎn)品對象的公共方法
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)建多個實現(xiàn)抽象工廠接口的具體工廠類。負(fù)責(zé)實現(xiàn)創(chuàng)建產(chǎn)品的內(nèi)部邏輯,該工廠類可以被直接調(diào)用,創(chuàng)建所需的具體對象。
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í)行
通過一個工廠類,對實現(xiàn)了同一接口的一些類進(jìn)行實例的創(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è)計模式之工廠方法模式深入詳解的文章就介紹到這了,更多相關(guān)Java工廠方法模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java調(diào)用webservice接口,并解析返回參數(shù)問題
這篇文章主要介紹了java調(diào)用webservice接口,并解析返回參數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07SpringBoot使用AES對JSON數(shù)據(jù)加密和解密的實現(xiàn)方法
這篇文章主要介紹了SpringBoot使用AES對JSON數(shù)據(jù)加密和解密的實現(xiàn)方法,文章通過代碼示例介紹的非常詳細(xì),對我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-08-08Springboot實現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場景)
這篇文章主要介紹了Springboot實現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場景),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11