Java中的工廠模式

設計模式遵循原則

  • 開閉原則:對擴展開放,對修改關閉
  • 里氏代換原則:只有當衍生類可以替換掉基類,軟件單位的功能不受到影響時,基類才能真正被覆用。而衍生類也能夠在基類的基礎上增加新的行為
  • 依賴倒轉原則:開閉原則的基礎,對接口編程,依賴于抽象而不依賴于具體
  • 接口隔離原則:使用多個隔離的接口來降低耦合度
  • 迪米特法原則:最少知道原則。一個實體應該盡量少的與其他實體之間發生相互作用,使得系統功能模塊相對獨立
  • 合成復用原則:盡量使用合成/聚合的方式,而不是使用繼承。繼承實際上破環了類的封裝性,超類的方法可能會被子類修改。

工廠模式

簡單工廠模式

簡單工廠模式當中,一個工廠負責生產所有的產品。如上圖所示,無論是戴爾鼠標還是惠普鼠標,都在一家鼠標工廠中生產。工廠通過用戶的需要生產不同的鼠標,即用戶傳入生產鼠標的參數,工廠返回生產出的鼠標實體。

具體實現如下:

//鼠標基類
class Mouse{public void sayHi(){};
}
//鼠標擴展類
class DellMouse extends Mouse{@Overridepublic void sayHi() {System.out.println("產品:戴爾鼠標");}
}
class HpMouse extends Mouse{@Overridepublic void sayHi() {System.out.println("產品:惠普鼠標");}
}
//鼠標工廠
class MouseFactory{//生產鼠標的方法,所有的鼠標都通過該方法生成public static Mouse createMouse(int i) {switch (i) {case 0: return new DellMouse();case 1: return new HpMouse();default: return null;}}
}
public class NormFactory {public static void main(String[] args) {Mouse hpm = MouseFactory.createMouse(1);Mouse dellm = MouseFactory.createMouse(0);hpm.sayHi();dellm.sayHi();}
}

打印結果如下:

產品:惠普鼠標
產品:戴爾鼠標

上述模式下,所有的鼠標都在同一個MouseFactory工廠下生產,有一個統一的create靜態方法。在使用工廠時,不需要對工廠進行實例化,只需要調用該靜態方法便可得到相應的產品。

但如果用戶需要添加新一類的產品,例如有一項華碩鼠標,工廠要生產該產品則需要改create函數,這有悖于設計原則的開閉原則。

工廠模式

在該模式下,不同品牌的產品交由不同的工廠來生產,有一個統一的工廠接口,生產該產品的工廠都要實現該接口。

生產哪種產品不再由參數決定,而是在創建工廠時讓工廠來決定,例如惠普的工廠只會生產惠普的鼠標,而戴爾的工廠只會生產戴爾的鼠標。

具體實現如下:

class Mouse{public void sayHi(){};
}class DellMouse extends Mouse{@Overridepublic void sayHi() {System.out.println("產品:戴爾鼠標");}
}
class HpMouse extends Mouse{@Overridepublic void sayHi() {System.out.println("產品:惠普鼠標");}
}
//生產工廠接口
interface MouseFactory{public Mouse createMouse();
}
//不同的鼠標交由不同的工廠生產
class HpMouseFactory implements MouseFactory{@Overridepublic Mouse createMouse() {return new HpMouse();}
}
class DellMouseFactory implements MouseFactory{@Overridepublic Mouse createMouse() {return new DellMouse();}
}
public class NormFactory {public static void main(String[] args) {MouseFactory hpFact = new HpMouseFactory();MouseFactory dellFact = new DellMouseFactory();Mouse hpm = hpFact.createMouse();Mouse dellm = dellFact.createMouse();hpm.sayHi();dellm.sayHi();}
}

打印結果如下:

產品:惠普鼠標
產品:戴爾鼠標

該模式下代碼的可擴展性大大提高,當需要添加一種商品時,只需要添加生產該商品的工廠,并讓其實現生產工廠接口即可。

但在該模式下,商品的生產變得更為復雜,我們要得到一件商品,必須先得到一座生產該商品的工廠,再調用該工廠的生產方法才能得到該商品。

抽象工廠模式

該模式下的工廠生產的產品不唯一,同一品牌的工廠有著各種不同的產品,相當于是工廠模式的一個加強版。

具體實現如下:

class Mouse{public void sayHi(){};
}class DellMouse extends Mouse {@Overridepublic void sayHi() {System.out.println("產品:戴爾鼠標");}
}
class HpMouse extends Mouse {@Overridepublic void sayHi() {System.out.println("產品:惠普鼠標");}
}class KeyBoard {public void kick(){};
}
class HpKeyBoard extends KeyBoard {@Overridepublic void kick() {System.out.println("產品:惠普鍵盤");}
}
class DellKeyBoard extends KeyBoard {@Overridepublic void kick() {System.out.println("產品:戴爾鍵盤");}
}
//總的工廠接口
interface PcFactory {public Mouse createMouse() ;public KeyBoard createKeyBoard() ;
}
class HpFactory implements PcFactory {@Overridepublic Mouse createMouse() {return new HpMouse();}@Overridepublic KeyBoard createKeyBoard() {return new HpKeyBoard();}
}
class DellFactory implements PcFactory {@Overridepublic Mouse createMouse() {return new DellMouse();}@Overridepublic KeyBoard createKeyBoard() {return new DellKeyBoard();}
}//當需要增加一個華碩工廠時:
class AsusMouse extends Mouse {@Overridepublic void sayHi() {System.out.println("產品:華碩鼠標");}
}
class AsusKeyBoard extends KeyBoard {@Overridepublic void kick() {System.out.println("產品:華碩鍵盤");}
}
class AsusFactory implements PcFactory {@Overridepublic Mouse createMouse() {return new AsusMouse();}@Overridepublic KeyBoard createKeyBoard() {return new AsusKeyBoard();}
}public class NormFactory {public static void main(String[] args) {PcFactory hpFact = new HpFactory();Mouse hpm = hpFact.createMouse();KeyBoard hpkbd = hpFact.createKeyBoard();PcFactory dellFact = new DellFactory();Mouse dellm = dellFact.createMouse();KeyBoard dellkbd = dellFact.createKeyBoard();hpm.sayHi();dellm.sayHi();hpkbd.kick();dellkbd.kick();}
}

打印結果如下:

產品:惠普鼠標
產品:戴爾鼠標
產品:惠普鍵盤
產品:戴爾鍵盤

但該模式如果要添加產品時,需要修改PcFactory、DellFactory、HpFactory等所有實現了PcFactroy接口的工廠類,這是十分不好的。

轉載于:https://www.cnblogs.com/JuanF/p/9275833.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538317.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538317.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538317.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python的底層實現_Python底層封裝實現方法詳解

這篇文章主要介紹了Python底層封裝實現方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下事實上,python封裝特性的實現純屬“投機取巧”,之所以類對象無法直接調用私有方法和屬性&a…

php 附近的距離,PHP查詢附近的人及其距離的實現方法_PHP

本文實例講述了PHP查詢附近的人及其距離的實現方法。分享給大家供大家參考,具體如下:array(lat>$lat $dlat,lng>$lng-$dlng),right-top>array(lat>$lat $dlat, lng>$lng $dlng),left-bottom>array(lat>$lat - $dlat, lng>$ln…

統計指定目錄下的視頻時長

package time;import java.io.File;import org.apache.log4j.Logger;import it.sauronsoftware.jave.Encoder; import it.sauronsoftware.jave.EncoderException; import it.sauronsoftware.jave.MultimediaInfo;public class Test2 {/* 支持的后綴 */private static final Str…

怎么在cmd中運行python腳本_cmd中運行python腳本智能使用流程

(此時的ScaleMode自動變Vbuser)更有趣的是用來計算字串高、寬的TextHeight/TextWidth也變成以座標0-100的方式來表現了On Error Resume NextSet outstreemWscript.stdoutIf (LCase(Right(Wscript.fullname,11))"Wscript.exe") ThenSet objShellWscript.CreateObject(…

世界時鐘 軟件_Clocker for Mac(世界時鐘軟件)

Clocker for Mac是一款Mac平臺上免費的世界時鐘工具,方便我們查看世界各地的時間,它是開源免費的,完全沒有廣告。包括數百個時區,支持24小時制或AM / PM,macz提供Clocker mac免費版,歡迎前來下載&#xff0…

Mac 設置 NDK

2019獨角獸企業重金招聘Python工程師標準>>> 1、首先查看我自己的android studio ,找到以下路徑 如上圖,打開一個 AS 項目,file - project structure 這是我的3 個路徑 Ndk /Users/dhbm/Library/Android/sdk/ndk-bundle Sdk /User…

Workbench has not been created yet

原因是:加載的插件變更后需要清理 在啟動參數最后加入 -clean

oracle必須聲明標識符函數,引用變量時需要必須聲明標識符

SQL> declare2 pname emp.ename%type;3 psal emp.sal%type;4 begin5 select enmae,sal into pname,psal from emp where empno7782;6 dbms_output.put_line(pname||xsis||psal);7 end;8 /pname emp.ename%type;*第 2 行出現錯誤:ORA-06550: 第 2 行, 第 7 列:PLS-002…

四參數擬合曲線_每周放送|曲線擬合

曲線擬合No.1什么是曲線擬合所謂的曲線擬合,就是使用某一個模型(或者稱為方程式),將一系列的數據擬成平滑的曲線,以便觀察兩組數據之間的內在聯系,了解數據之間的變化趨勢。No.2曲線擬合的應用在數據分析時,我們有時需…

Spark集群運行jar包程序里的print日志哪里去了?

默認情況下,是輸出到stdout里的。 方法一: 進入work所在機器的spark安裝目錄下的work目錄,里面有日志輸出。 方法二: 進入spark web ui 里 點擊stdout就可以查看,如果沒有可能在其他work上。

hibernate oracle clob 注解,Hibernate3.X實現基于CLOB字段類型的注解方式:

一:Hibernate3.X實現基于CLOB字段類型的注解方式的例子:下面直接上代碼:二:UserInfo.javapackage cn.gov.csrc.cms.model;import javax.persistence.Basic;import javax.persistence.Column;import javax.persistence.Entity;impo…

Flutter下拉刷新,上拉加載更多數據

下拉刷新 很簡單,直接使用 RefreshIndicator 組件, onRefresh 為重新獲取數據的方法 Widget build(BuildContext context) {return Scaffold(body: Container(padding: EdgeInsets.all(2.0),child: RefreshIndicator(onRefresh: _refresh,backgroundColo…

qt 批量裁剪圖片_照片變素描,不用下載App,好用的在線圖片處理及圖庫

我們要處理圖片時,無論是在電腦還是手機上,往往都需要下載軟件,但如果你只是臨時用一下的話,下載軟件難免顯得工程有點浩大。下面就推薦幾個圖片處理網站,打開網頁就能用。1、圖片處理 funny。pho。to這個網站提供了很…

Intellij IDEA15:建立Scala的Maven項目

原文鏈接:http://blog.csdn.net/silentwolfyh/article/details/51172369 ------------------------------------------------------------------------------------ 在創建Scala的Maven之前要安裝JavaJDK 、 Scala 的JDK 、 Maven配置,請參考下面 Int…

linux臨時啟動進程命令,Linux常用命令(一)服務控制及優化啟動過程

Linux常用命令(一)服務控制及優化啟動過程一、Red hat系統開機引導過程1、linux操作系統的引導過程一般包括以下幾個階段:開機自檢、MBR引導、GRUB菜單、加載Linux內核、init進程初始化。2、Linux系統中的進程使用數字進行標記,每個進程的身份標記號稱為…

linux 解決端口占用

2019獨角獸企業重金招聘Python工程師標準>>> 1. netstat -apn|grep 9876 2.kill -9 端口號 --------- java 在linux后臺運行的命令 ------------- nohup java -jar demo-shiro-0.0.1-SNAPSHOT.jar >temp.txt & 轉載于:https://my.oschina.net/likaixuan0/…

天鋒w2019_什么樣的商務手機才顯得高端?這款天鋒W2019可能適合你

不同的人群有不同的需求,不同于普通的手機用戶,商務人士所需的手機需要能體現商務人士的身價。商務人士需要帶著手機出入各種商務場所,進行會議、談判、簽約等商務事宜,一款普通的手機無法體現商務人士的高端和深度。同時商務人士…

IDEA中 @override報錯的解決方法

原文路徑:http://www.cnblogs.com/printN/p/6870036.html ------------------------------------ 今天用IDEA導入一個java工程時,碰上一個問題,代碼中所有override處標紅,并提示:override不支持對接口的實現。 網上百…

Linux目錄的可寫意味著,Linux權限分析 - osc_h5427nyq的個人空間 - OSCHINA - 中文開源技術交流社區...

在學習Linux的權限之前,我們先來理解幾個概念:可讀,可寫 、可執行Linux的文件和目錄有以下三種方式:r 、w 、x:可讀,可寫 、可執行r-可讀(read)w-可寫(write)x-可執行(execute)所有者 、所屬組 、其他人Linux的文件和目錄又可以有…

【深度學習篇】--Windows 64下tensorflow-gpu安裝到應用

一、前述 一直以為自己的筆記本不支持tensflow-gpu的運行,結果每次運行模型都要好久。偶然間一個想法,想試試自己的筆記本,結果竟然神奇的發現能用GPU。于是分享一下安裝步驟. 二、具體 因為版本之間有嚴格的對應關系,所以本文就將…