java設(shè)計模式之簡單工廠模式簡述
簡單工廠模式的概念
就是建立一個工廠類,對實現(xiàn)了同一接口的一些類進(jìn)行實例的創(chuàng)建。簡單工廠模式的實質(zhì)是由一個工廠類根據(jù)傳入的參數(shù),動態(tài)決定應(yīng)該創(chuàng)建哪一個產(chǎn)品類(這些產(chǎn)品類繼承自一個父類或接口)的實例。
簡單工廠模式的UML圖

簡單工廠模式代碼
學(xué)習(xí)簡單工廠模式的時候我用的是一個與人類有相關(guān)的例子。人類在世界分為男人和女人,首先定義一個Human產(chǎn)品的抽象接口
/**
* This is factory patter package
*/
package com.roc.factory;
/**
* 產(chǎn)品的抽象接口 人類
* @author liaowp
*
*/
public interface Human {
public void say();
}
然后定義男人和女人,同樣都有說話的方法。
/**
* This is factory patter package
*/
package com.roc.factory;
/**
* man 男人
* @author liaowp
*
*/
public class Man implements Human {
/* say method
* @see com.roc.factory.Human#say()
*/
@Override
public void say() {
System.out.println("男人");
}
}
/**
* This is factory patter package
*/
package com.roc.factory;
/**女人
* @author liaowp
*
*/
public class Woman implements Human {
/* say method
* @see com.roc.factory.Human#say()
*/
@Override
public void say() {
System.out.println("女人");
}
}
最后寫一個工廠類,用來創(chuàng)造男人和女人。第一種方式是使用邏輯判斷的方式實現(xiàn)的。
package com.roc.factory;
/**
* 簡單工廠
* @author liaowp
*
*/
public class SampleFactory {
public static Human makeHuman(String type){
if(type.equals("man")){
Human man = new Man();
return man;
}else if(type.equals("womman")){
Human woman = new Woman();
return woman;
}else{
System.out.println("生產(chǎn)不出來");
return null;
}
}
}
第二方式是使用java的放射實現(xiàn)的,我覺得這一類的實現(xiàn)方式比較好。
package com.roc.factory;
/**
* 簡單工廠放射實現(xiàn)
* @author liaowp
*
*/
public class SampleFactory1 {
public static Human makeHuman(Class c){
Human human = null;
try {
human = (Human) Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
System.out.println("不支持抽象類或接口");
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("沒有足夠權(quán)限,即不能訪問私有對象");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("類不存在");
e.printStackTrace();
}
return human;
}
}
最后是客戶端的代碼
package com.roc.factory;
/**
* 簡單工廠測試
* @author liaowp
*
*/
public class Client {
public static void main(String[] args) {
// Human man = SampleFactory.makeHuman("man");
// man.say();
// Human womman = SampleFactory.makeHuman("womman");
// womman.say();
// Human test = SampleFactory.makeHuman("tttt");
Human man = SampleFactory1.makeHuman(Man.class);
man.say();
Human woman = SampleFactory1.makeHuman(Woman.class);
woman.say();
}
}
簡單工廠模式應(yīng)用場景
優(yōu)點:工廠類是整個模式的關(guān)鍵.包含了必要的邏輯判斷,根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個具體類的對象.通過使用工廠類,外界可以從直接創(chuàng)建具體產(chǎn)品對象的尷尬局面擺脫出來,僅僅需要負(fù)責(zé)“消費”對象就可以了。而不必管這些對象究竟如何創(chuàng)建及如何組織的.明確了各自的職責(zé)和權(quán)利,有利于整個軟件體系結(jié)構(gòu)的優(yōu)化。
缺點:由于工廠類集中了所有實例的創(chuàng)建邏輯,違反了高內(nèi)聚責(zé)任分配原則,將全部創(chuàng)建邏輯集中到了一個工廠類中;它所能創(chuàng)建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了。當(dāng)系統(tǒng)中的具體產(chǎn)品類不斷增多時候,可能會出現(xiàn)要求工廠類根據(jù)不同條件創(chuàng)建不同實例的需求.這種對條件的判斷和對具體產(chǎn)品類型的判斷交錯在一起,很難避免模塊功能的蔓延,對系統(tǒng)的維護(hù)和擴(kuò)展非常不利;
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java利用LocalDate類實現(xiàn)日歷設(shè)計
java中做時間處理時一般會采用java.util.Date,但是相比于Date來說,還有更好的選擇--java.time.LocalDate。本文就來用LocalDate類實現(xiàn)日歷設(shè)計,感興趣的可以動手嘗試一下2022-07-07
從JVM的內(nèi)存管理角度分析Java的GC垃圾回收機(jī)制
這篇文章主要介紹了從JVM的內(nèi)存管理角度分析Java的GC垃圾回收機(jī)制,帶有GC是Java語言的重要特性之一,需要的朋友可以參考下2015-11-11
SSM框架中測試單元的使用 spring整合Junit過程詳解
這篇文章主要介紹了SSM框架中測試單元的使用 spring整合Junit過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09
使用Java自定義注解實現(xiàn)一個簡單的令牌桶限流器
限流是在分布式系統(tǒng)中常用的一種策略,它可以有效地控制系統(tǒng)的訪問流量,保證系統(tǒng)的穩(wěn)定性和可靠性,在本文中,我將介紹如何使用Java自定義注解來實現(xiàn)一個簡單的令牌桶限流器,需要的朋友可以參考下2023-10-10
如何使用@Value和@PropertySource注入外部資源
這篇文章主要介紹了如何使用@Value和@PropertySource注入外部資源的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
通過java反射機(jī)制動態(tài)調(diào)用某方法的總結(jié)(推薦)
下面小編就為大家?guī)硪黄ㄟ^java反射機(jī)制動態(tài)調(diào)用某方法的總結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-07-07

