Java設(shè)計(jì)模式之靜態(tài)工廠模式詳解
本文實(shí)例講述了Java設(shè)計(jì)模式之靜態(tài)工廠模式。分享給大家供大家參考,具體如下:
靜態(tài)工廠模式(static factory)也叫簡(jiǎn)單工廠模式。
涉及到3個(gè)角色:工廠類角色,抽象產(chǎn)品類角色和具體產(chǎn)品類角色。
抽象產(chǎn)品類可以使用接口或者父類來描述產(chǎn)品對(duì)象的行為特征。
具體產(chǎn)品類就是某一具體的對(duì)象。
靜態(tài)工廠類有一個(gè)靜態(tài)的方法,含有判斷邏輯,決定要?jiǎng)?chuàng)建哪一種具體的產(chǎn)品對(duì)象。
其設(shè)計(jì)模式如下:
抽象產(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("")){//默認(rèn)創(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)建對(duì)象,像上面的構(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; } }
測(cè)試:
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)點(diǎn)就是,工廠類負(fù)責(zé)所有產(chǎn)品對(duì)象的創(chuàng)建,客戶端在需要?jiǎng)?chuàng)建對(duì)象時(shí),告訴工廠需要哪種類型,工廠就負(fù)責(zé)創(chuàng)建。
缺點(diǎn):把所有類型的對(duì)象集中在一種工廠創(chuàng)建。當(dāng)產(chǎn)品對(duì)象在以后出現(xiàn)新的類型以及類型結(jié)構(gòu)變得復(fù)雜,這個(gè)工廠就會(huì)顯得簡(jiǎn)單混亂。
比如,一個(gè)生產(chǎn)自行車的工廠,它會(huì)生產(chǎn)各種自行車,男士女士的等等。隨著工廠發(fā)展壯大,它收購(gòu)了電視工廠。這時(shí)候,工廠還是叫自行車制造廠。但是生產(chǎn)電視。也就是在工廠類中加入了新的產(chǎn)品類型:電視。這樣的工廠也能正常運(yùn)轉(zhuǎn),但是結(jié)構(gòu)顯得簡(jiǎn)單,功能混亂。
同時(shí)使用靜態(tài)方法,也無法實(shí)現(xiàn)子類繼承。
解決這樣的問題就涉及到另一種稍顯復(fù)雜的模式:工廠模式。
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Java中YYYY-MM-dd與yyyy-MM-dd的區(qū)別及跨年問題
YYYY-MM-dd可能會(huì)導(dǎo)致跨年周的日期被歸屬到錯(cuò)誤的年份, yyyy-MM-dd總是表示實(shí)際的日歷年份,無論日期所在的周是否跨年,本文就來介紹一下兩者的區(qū)別,感興趣的可以了解一下2024-01-01Java實(shí)現(xiàn)簡(jiǎn)單的銀行管理系統(tǒng)的示例代碼
這篇文章主要介紹了如何利用Java實(shí)現(xiàn)簡(jiǎn)單的銀行管理系統(tǒng),可以實(shí)現(xiàn)存款,取款,查詢等功能,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-09-09深入學(xué)習(xí)Java 動(dòng)態(tài)代理
Java 動(dòng)態(tài)代理機(jī)制的出現(xiàn),使得 Java 開發(fā)人員不用手工編寫代理類,只要簡(jiǎn)單地指定一組接口及委托類對(duì)象,便能動(dòng)態(tài)地獲得代理類。下面小編和大家來一起學(xué)習(xí)一下吧2019-05-05