Java創(chuàng)建型設(shè)計模式之工廠方法模式深入詳解
簡單工廠模式
簡單工廠模式(Simple Factory Pattern)是指由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例,但是它不屬于設(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)建一個實(shí)現(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)險。可進(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)建對象的接口,讓其子類自己決定實(shí)例化哪一個工廠類,工廠模式使其創(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)品類實(shí)例如何被創(chuàng)建、實(shí)現(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)品的具體實(shí)現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口
缺點(diǎn):
1.每增加一個產(chǎn)品時,都需要增加一個具體類和對象實(shí)現(xiàn)工廠,使系統(tǒng)中類的個數(shù)成倍增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,同時也增加了系統(tǒng)具體類的依賴。
主要角色
1.抽象產(chǎn)品角色(Product)
工廠方法模式所創(chuàng)建的對象的超類型,也就是產(chǎn)品對象的共同父類或共同擁有的接口。
2.具體產(chǎn)品角色(Concrete Product)
這個角色實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口。某具體產(chǎn)品有專門的具體工廠創(chuàng)建,它們之間往往一一對應(yīng)。
3.抽象工廠角色(Creator)
是工廠方法模式的核心,與應(yīng)用程序無關(guān)。任何在模式中創(chuàng)建的對象的工廠類必須實(shí)現(xiàn)這個接口。
4.具體工廠角色(Concrete Creator)
這是實(shí)現(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)建多個實(shí)現(xiàn)抽象工廠接口的具體工廠類。負(fù)責(zé)實(shí)現(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í)行
通過一個工廠類,對實(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è)計模式之工廠方法模式深入詳解的文章就介紹到這了,更多相關(guān)Java工廠方法模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring4.3 實(shí)現(xiàn)跨域CORS的方法
下面小編就為大家分享一篇spring4.3 實(shí)現(xiàn)跨域CORS的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
RabbitMq消息防丟失功能實(shí)現(xiàn)方式講解
這篇文章主要介紹了RabbitMq消息防丟失功能實(shí)現(xiàn),RabbitMQ中,消息丟失可以簡單的分為兩種:客戶端丟失和服務(wù)端丟失。針對這兩種消息丟失,RabbitMQ都給出了相應(yīng)的解決方案2023-01-01
Java實(shí)現(xiàn)的zip工具類完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的zip工具類,結(jié)合完整實(shí)例形式分析了Java針對zip文件指定路徑壓縮、遞歸壓縮等相關(guān)操作技巧,需要的朋友可以參考下2018-12-12
java調(diào)用webservice接口,并解析返回參數(shù)問題
這篇文章主要介紹了java調(diào)用webservice接口,并解析返回參數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
SpringBoot使用AES對JSON數(shù)據(jù)加密和解密的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringBoot使用AES對JSON數(shù)據(jù)加密和解密的實(shí)現(xiàn)方法,文章通過代碼示例介紹的非常詳細(xì),對我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-08-08
Springboot實(shí)現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場景)
這篇文章主要介紹了Springboot實(shí)現(xiàn)高吞吐量異步處理詳解(適用于高并發(fā)場景),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11

