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

簡(jiǎn)單工廠(chǎng)模式代碼
學(xué)習(xí)簡(jiǎn)單工廠(chǎng)模式的時(shí)候我用的是一個(gè)與人類(lèi)有相關(guān)的例子。人類(lèi)在世界分為男人和女人,首先定義一個(gè)Human產(chǎn)品的抽象接口
/**
* This is factory patter package
*/
package com.roc.factory;
/**
* 產(chǎn)品的抽象接口 人類(lèi)
* @author liaowp
*
*/
public interface Human {
public void say();
}
然后定義男人和女人,同樣都有說(shuō)話(huà)的方法。
/**
* 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("女人");
}
}
最后寫(xiě)一個(gè)工廠(chǎng)類(lèi),用來(lái)創(chuàng)造男人和女人。第一種方式是使用邏輯判斷的方式實(shí)現(xiàn)的。
package com.roc.factory;
/**
* 簡(jiǎn)單工廠(chǎng)
* @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)不出來(lái)");
return null;
}
}
}
第二方式是使用java的放射實(shí)現(xiàn)的,我覺(jué)得這一類(lèi)的實(shí)現(xiàn)方式比較好。
package com.roc.factory;
/**
* 簡(jiǎn)單工廠(chǎng)放射實(shí)現(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("不支持抽象類(lèi)或接口");
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("沒(méi)有足夠權(quán)限,即不能訪(fǎng)問(wèn)私有對(duì)象");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("類(lèi)不存在");
e.printStackTrace();
}
return human;
}
}
最后是客戶(hù)端的代碼
package com.roc.factory;
/**
* 簡(jiǎn)單工廠(chǎng)測(cè)試
* @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();
}
}
簡(jiǎn)單工廠(chǎng)模式應(yīng)用場(chǎng)景
優(yōu)點(diǎn):工廠(chǎng)類(lèi)是整個(gè)模式的關(guān)鍵.包含了必要的邏輯判斷,根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類(lèi)的對(duì)象.通過(guò)使用工廠(chǎng)類(lèi),外界可以從直接創(chuàng)建具體產(chǎn)品對(duì)象的尷尬局面擺脫出來(lái),僅僅需要負(fù)責(zé)“消費(fèi)”對(duì)象就可以了。而不必管這些對(duì)象究竟如何創(chuàng)建及如何組織的.明確了各自的職責(zé)和權(quán)利,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。
缺點(diǎn):由于工廠(chǎng)類(lèi)集中了所有實(shí)例的創(chuàng)建邏輯,違反了高內(nèi)聚責(zé)任分配原則,將全部創(chuàng)建邏輯集中到了一個(gè)工廠(chǎng)類(lèi)中;它所能創(chuàng)建的類(lèi)只能是事先考慮到的,如果需要添加新的類(lèi),則就需要改變工廠(chǎng)類(lèi)了。當(dāng)系統(tǒng)中的具體產(chǎn)品類(lèi)不斷增多時(shí)候,可能會(huì)出現(xiàn)要求工廠(chǎng)類(lèi)根據(jù)不同條件創(chuàng)建不同實(shí)例的需求.這種對(duì)條件的判斷和對(duì)具體產(chǎn)品類(lèi)型的判斷交錯(cuò)在一起,很難避免模塊功能的蔓延,對(duì)系統(tǒng)的維護(hù)和擴(kuò)展非常不利;
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Spring Cloud Feign 熔斷配置的一些小坑
這篇文章主要介紹了詳解Spring Cloud Feign 熔斷配置的一些小坑,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
基于Spring實(shí)現(xiàn)零重啟自由編排任務(wù)的定時(shí)管理器
我們發(fā)現(xiàn),我們使用Spring自帶的定時(shí)任務(wù)如果要有修改,那么就要修改代碼,然后重啟項(xiàng)目,所以本文就帶大家實(shí)現(xiàn)一個(gè)零重啟自由編排任務(wù)的定時(shí)管理器吧2023-07-07
jpa?EntityManager?復(fù)雜查詢(xún)實(shí)例
這篇文章主要介紹了jpa?EntityManager?復(fù)雜查詢(xún)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
在攔截器中讀取request參數(shù),解決在controller中無(wú)法二次讀取的問(wèn)題
這篇文章主要介紹了在攔截器中讀取request參數(shù),解決在controller中無(wú)法二次讀取的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
mybatis中實(shí)現(xiàn)枚舉自動(dòng)轉(zhuǎn)換方法詳解
在使用mybatis的時(shí)候經(jīng)常會(huì)遇到枚舉類(lèi)型的轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于mybatis中實(shí)現(xiàn)枚舉自動(dòng)轉(zhuǎn)換的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-08-08

