Java設(shè)計模式之靜態(tài)工廠模式詳解
本文實例講述了Java設(shè)計模式之靜態(tài)工廠模式。分享給大家供大家參考,具體如下:
靜態(tài)工廠模式(static factory)也叫簡單工廠模式。
涉及到3個角色:工廠類角色,抽象產(chǎn)品類角色和具體產(chǎn)品類角色。
抽象產(chǎn)品類可以使用接口或者父類來描述產(chǎn)品對象的行為特征。
具體產(chǎn)品類就是某一具體的對象。
靜態(tài)工廠類有一個靜態(tài)的方法,含有判斷邏輯,決定要創(chuàng)建哪一種具體的產(chǎn)品對象。
其設(shè)計模式如下:

抽象產(chǎn)品類 IProduct
package org.test.design.sf;
public interface IProduct {
void work();
}
具體產(chǎn)品類 ProductA ProductB
package org.test.design.sf;
public class ProductA implements IProduct {
public void work() {
System.out.println("Here is ProductA, for your dedicated service.");
}
}
package org.test.design.sf;
public class ProductB implements IProduct {
public void work() {
System.out.println("Here is ProductB, for your dedicated service.");
}
}
工廠類 ProductFactory
package org.test.design.sf;
/**
* 靜態(tài)工廠模式
* @author lushuaiyin
*
*/
public class ProductFactory {
public static IProduct product=null;//靜態(tài)
//靜態(tài)方法
public static IProduct getProduct(String productType) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
// if(productType==null||productType.trim().equals("")){//默認創(chuàng)建ProductA
// product=new ProductA();
// }else if(productType.trim().equals("ProductA")){
// product=new ProductA();
// }else if(productType.trim().equals("ProductB")){
// product=new ProductB();
// }
//靜態(tài)工廠一般使用類的反射來構(gòu)建對象,像上面的構(gòu)建也可以。
if(productType.trim().equals("ProductA")){
product=(IProduct)Class.forName("org.test.design.sf.ProductA").newInstance();
}else if(productType.trim().equals("ProductB")){
product=(IProduct)Class.forName("org.test.design.sf.ProductB").newInstance();
}
return product;
}
}
測試:
package org.test.design.sf;
public class TestMain {
/**
* @param args
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
IProduct product_a=ProductFactory.getProduct("ProductA");
product_a.work();
IProduct product_b=ProductFactory.getProduct("ProductB");
product_b.work();
}
}
/*打印
Here is ProductA, for your dedicated service.
Here is ProductB, for your dedicated service.
*/
這種模式的優(yōu)點就是,工廠類負責(zé)所有產(chǎn)品對象的創(chuàng)建,客戶端在需要創(chuàng)建對象時,告訴工廠需要哪種類型,工廠就負責(zé)創(chuàng)建。
缺點:把所有類型的對象集中在一種工廠創(chuàng)建。當(dāng)產(chǎn)品對象在以后出現(xiàn)新的類型以及類型結(jié)構(gòu)變得復(fù)雜,這個工廠就會顯得簡單混亂。
比如,一個生產(chǎn)自行車的工廠,它會生產(chǎn)各種自行車,男士女士的等等。隨著工廠發(fā)展壯大,它收購了電視工廠。這時候,工廠還是叫自行車制造廠。但是生產(chǎn)電視。也就是在工廠類中加入了新的產(chǎn)品類型:電視。這樣的工廠也能正常運轉(zhuǎn),但是結(jié)構(gòu)顯得簡單,功能混亂。
同時使用靜態(tài)方法,也無法實現(xiàn)子類繼承。
解決這樣的問題就涉及到另一種稍顯復(fù)雜的模式:工廠模式。
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
Spring使用@Autowired注解靜態(tài)實例對象方式
這篇文章主要介紹了Spring使用@Autowired注解靜態(tài)實例對象方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Java數(shù)據(jù)庫連接_jdbc-odbc橋連接方式(詳解)
下面小編就為大家?guī)硪黄狫ava數(shù)據(jù)庫連接_jdbc-odbc橋連接方式(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
Java實現(xiàn)駝峰和下劃線互相轉(zhuǎn)換的示例代碼
Java對各種變量、方法和類等要素命名時使用的字符序列稱為標(biāo)識符,凡是自己可以起名字的地方都叫標(biāo)識符。本文為大家分享了Java中如何實現(xiàn)駝峰命名與下劃線命名的互轉(zhuǎn),感興趣的可以了解一下2022-05-05
java基礎(chǔ)篇之Date類型最常用的時間計算(相當(dāng)全面)
這篇文章主要給大家介紹了關(guān)于java基礎(chǔ)篇之Date類型最常用的時間計算的相關(guān)資料,Java中的Date類是用來表示日期和時間的類,它提供了一些常用的方法來處理日期和時間的操作,需要的朋友可以參考下2023-12-12
SpringBoot使用log4j2將日志記錄到文件及自定義數(shù)據(jù)庫的配置方法
這篇文章主要介紹了SpringBoot使用log4j2將日志記錄到文件及自定義數(shù)據(jù)庫的配置方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-03-03
Spring Web MVC和Hibernate的集成配置詳解
這篇文章主要介紹了Spring Web MVC和Hibernate的集成配置詳解,具有一定借鑒價值,需要的朋友可以參考下2017-12-12

