Java工廠模式的使用細(xì)則介紹
工廠模式
工廠模式顧名思義就是生產(chǎn)實例的工廠,使用工廠模式不會在程序中使用new關(guān)鍵字創(chuàng)建實例。而是將創(chuàng)建對象的細(xì)節(jié)隱藏,對外提供統(tǒng)一的方法,外部通過該方法獲取實例。以此降低調(diào)用者與程序之間的耦合性,更加靈活
工廠模式可以分為三類
- 簡單工廠模式
- 工廠方法模式
- 抽象工廠模式
簡單工廠模式
定義一個接口,將創(chuàng)建對象和其本身的業(yè)務(wù)分離解耦,如下示例:
public interface Pet {
void shout();
}
public class Cat implements Pet{
public void shout() {
System.out.println("貓叫");
}
}
public class Dog implements Pet{
public void shout() {
System.out.println("狗叫");
}
}
// 寵物工廠
public class PetFactory {
// 方式一
public static Pet getPet(String pet) {
if (pet.equals("小貓")) {
return new Cat();
} else if (pet.equals("小狗")) {
return new Dog();
} else {
return null;
}
}
// 方式二
public static Pet getCat(){
return new Cat();
}
public static Pet getDog(){
return new Dog();
}
}
// 用戶類
public class Customer {
public static void main(String[] args) {
Pet pet = PetFactory.getPet("小貓");
pet.shout();
}
}
// 輸出 : 貓叫
如上述代碼所示,創(chuàng)建對象只需要直接調(diào)用PetFactory工廠的創(chuàng)建方法即可,根據(jù)用戶需求來創(chuàng)建指定對象,執(zhí)行對應(yīng)方法
工廠方法模式
工廠方法模式相對于簡單工廠,提高了拓展性,可以在不影響原有類的情況下實現(xiàn)橫向擴展其他類,但是代碼量加大,可能會產(chǎn)生更多的代碼冗余。
我們針對每一個類都為其設(shè)置單獨的工廠,即每個工廠只生產(chǎn)一種類型,如果在需要新增其他類型那么只需要創(chuàng)建其工廠提供獲取實例方法即可
public interface Pet {
void shout();
}
public class Cat implements Pet {
public void shout() {
System.out.println("貓叫");
}
}
public class CatFactory {
public static Pet getCat(){
return new Cat();
}
}
public class Customer {
public static void main(String[] args) {
Pet cat = CatFactory.getCat();
cat.shout();
}
}
使用工廠方法模式可以再不修改原有代碼的基礎(chǔ)上繼續(xù)擴展,但是工作量較大
對比簡單工廠和工廠方法模式:就代碼和結(jié)構(gòu)的復(fù)雜度,使用簡單工廠模式更加簡便,但是對于可拓展性則工廠方法模式更加優(yōu)越
抽象工廠模式
抽象工廠用于常見一系列相關(guān)對象的家族,抽象的意思是,我們會定義一個工廠接口并且不做任何實現(xiàn),只用來約束它的實現(xiàn)工廠生產(chǎn)產(chǎn)品的規(guī)范。
四大核心:抽象工廠、具體工廠、抽象產(chǎn)品、具體產(chǎn)品
以華為、小米生產(chǎn)手機和電視為例:

代碼如下:
// 工廠接口
public interface ProductFactory {
RouterProduct getRouter(); // 生產(chǎn)路由器
PhoneProduct getPhone(); // 生產(chǎn)手機
}
// 手機、路由器接口
public interface PhoneProduct { void close();}
public interface RouterProduct {void start();}
// 工廠
public class HuaweiFactory implements ProductFactory{
public RouterProduct getRouter() {return new HuaweiRouter();}
public PhoneProduct getPhone() {
return new HuaweiPhone();
}
}
public class XiaoMiFactory implements ProductFactory{
public RouterProduct getRouter() {
return new XiaoMiRouter();
}
public PhoneProduct getPhone() {
return new XiaoMiPhone();
}
}
// 測試
public static void main(String[] args) {
// 拿到工廠對象
XiaoMiFactory miFactory = new XiaoMiFactory();
HuaweiFactory huaweiFactory = new HuaweiFactory();
// 小米工廠生產(chǎn)
PhoneProduct miFactoryPhone = miFactory.getPhone();
miFactoryPhone.close();
RouterProduct router = miFactory.getRouter();
router.start();
// 華為工廠生產(chǎn)
PhoneProduct phone = huaweiFactory.getPhone();
phone.close();
RouterProduct router1 = huaweiFactory.getRouter();
router1.start();
}
還有其他的產(chǎn)品接口實現(xiàn)類,華為手機、小米手機、華為路由器等等
同樣的抽象工廠模式也可以進(jìn)行擴展但是比較繁瑣,需要再頂級工廠也就是工廠接口中去擴展,但是擴展之后其所有的實現(xiàn)類也都需要完成實現(xiàn)。如果是長期穩(wěn)定狀態(tài)下可以這樣擴展,但是經(jīng)常改動的話抽象工廠模式就顯得非常雞肋
到此這篇關(guān)于Java工廠模式的使用細(xì)則介紹的文章就介紹到這了,更多相關(guān)Java工廠模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決springboot中mongodb不啟動及Dao不能被掃描到的問題
這篇文章主要介紹了解決springboot中mongodb不啟動及Dao不能被掃描到的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
Java設(shè)計模式之狀態(tài)模式State Pattern詳解
這篇文章主要介紹了Java設(shè)計模式之狀態(tài)模式State Pattern,狀態(tài)模式允許一個對象在其內(nèi)部狀態(tài)改變的時候改變其行為。這個對象看上去就像是改變了它的類一樣2022-11-11
SpringBoot 注解事務(wù)聲明式事務(wù)的方式
springboot使用上述注解的幾種方式開啟事物,可以達(dá)到和xml中聲明的同樣效果,但是卻告別了xml,使你的代碼遠(yuǎn)離配置文件。今天就扒一扒springboot中事務(wù)使用注解的玩法,感興趣的朋友一起看看吧2017-09-09
如何解決通過spring-boot-maven-plugin package失敗問題
這篇文章主要介紹了如何解決通過spring-boot-maven-plugin package失敗問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04

