一天一種設計模式之六-----工廠方法模式

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

一.工廠方法模式

  1. 工廠方法模式屬于創建型模式。

  2. 工廠方法模式定義:定義一個用于創建對象的借口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到了他的子類。

  3. 一般工廠類會有一個工廠的接口,實現類也有一個實現的接口。工廠接口負責定義一個創建實現接口的方法,而工廠類負責創建具體的實現類。

  4. 工廠模式根據抽象程度的不同分為三種:簡單工廠模式(也叫靜態工廠模式),工廠方法模式以及抽象工廠模式。工廠模式是編程中經常會遇到的一種模式。

  5. 工廠方法模式的優點有:

    1. 使代碼結構清晰,有效的封裝變化。在編程中,產品類的實例化有時候是復雜多變的,通過工廠模式將產品的實例化封裝起來,是的調用者無需關心實例化過程只需依賴工廠即可得到自己想要的產品。

    2. 對調用者屏蔽具體的產品類。如果使用工廠模式,調用者只需要關心產品的接口就可以了,即使變更了具體的實現,對調用這來說沒有任何影響。

  6. 工廠方法模式符合開放封閉原則,迪米特法則,依賴倒置原則。

    二.測試代碼

  7. 測試代碼如下(實現一個計算器)下屬模式中,如果新增了其他的計算類,只需要新建一個計算類實現,和相應的計算類工廠就可以了。

  8. public?class?GongChangMethodTest?{public?static?void?main(String[]?args)?{IFactory?factory?=?new?SumFactory();Jisuan?jisuan?=?factory.createJisuan();jisuan.setNum1(12);jisuan.setNum2(44);;System.out.println(jisuan.getResult());}
    }interface?IFactory?{Jisuan?createJisuan();
    }class?SumFactory?implements?IFactory?{@Overridepublic?Jisuan?createJisuan()?{return?new?SumJisuan();}}class?SubFactory?implements?IFactory?{@Overridepublic?Jisuan?createJisuan()?{return?new?SubJisuan();}
    }class?MulFactory?implements?IFactory?{@Overridepublic?Jisuan?createJisuan()?{return?new?MulJisuan();}
    }class?DevFactory?implements?IFactory?{@Overridepublic?Jisuan?createJisuan()?{return?new?DevJisuan();}
    }abstract?class?Jisuan?{private?int?num1;private?int?num2;public?Jisuan()?{}public?Jisuan(int?num1,?int?num2)?{this.num1?=?num1;this.num2?=?num2;}public?abstract?int?getResult();public?int?getNum1()?{return?num1;}public?void?setNum1(int?num1)?{this.num1?=?num1;}public?int?getNum2()?{return?num2;}public?void?setNum2(int?num2)?{this.num2?=?num2;}
    }class?SumJisuan?extends?Jisuan?{@Overridepublic?int?getResult()?{return?getNum1()?+?getNum2();}}class?SubJisuan?extends?Jisuan?{@Overridepublic?int?getResult()?{return?getNum1()?-?getNum2();}
    }class?MulJisuan?extends?Jisuan?{@Overridepublic?int?getResult()?{return?getNum1()?*?getNum2();}
    }class?DevJisuan?extends?Jisuan?{@Overridepublic?int?getResult()?{int?result?=?0;if?(getNum2()?!=?0)?{result?=?getNum1()?/?getNum2();}return?result;}
    }
  9. 企業級應用中,我們對數據庫的實現就可以采用上述模式
    實際上,我們再加上其他表,IFactory中再增加createXXXFactory就成了抽象工廠模式了,抽象工廠只是比工廠方法多了一個緯度而已

public?class?GongChangMethodTest?{public?static?void?main(String[]?args)?{IFactory?factory=new?MysqlUserFactory();IUserService?service=factory.createUserService();service.insert();}
}	
interface?IUserService{void?insert();
}
class?UserService?implements?IUserService{@Overridepublic?void?insert()?{System.out.println("insert?方法");}
}
interface?IFactory{public?IUserService?createUserService();
}	
abstract?class?MysqlFactory?implements?IFactory{//這里可以做一些初始化mysql連接的事情
}
abstract?class?SqlServerFactory?implements?IFactory{//這里可以做一些初始化mysql連接的事情
}
//如果想換成sqlserver,只需要加一個SqlserverUserFactory就可以了
class?MysqlUserFactory?extends?MysqlFactory{@Overridepublic?IUserService?createUserService()?{return?new?UserService();}}



























轉載于:https://my.oschina.net/u/2323537/blog/636408

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

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

相關文章

[轉]IPython介紹

1. IPython介紹 ipython是一個python的交互式shell,比默認的python shell好用得多,支持變量自動補全,自動縮進,支持bash shell命令,內置了許多很有用的功能和函數。學習ipython將會讓我們以一種更高的效率來使用python…

.NET MAUI in Mac

點擊上方藍字關注我們(本文閱讀時間:4分鐘)概要本篇文章主要分享MAUI在m1芯片的設備上運行和支持情況,將我們寫好的MAUI程序編譯為支持mac平臺的版本。在m1芯片剛剛出來的時候有很多開發工具和應用程序對m1芯片的支持不是很友好&a…

30分鐘時長千行代碼《C#程序設計基礎》經典程序,C#菜鳥開發必備!

作者:劉一哥GIS(CSDN博客專家) 博客地址:https://geostorm.blog.csdn.net/ 劉一哥,多年研究地圖學、地理信息系統、遙感、攝影測量和GPS等應用,精通ArcGIS、MapGIS、ENVI、Erdas、CASS、Pix4d、CC、PhotoScan、Inpho、EPS、Globalmapper等專業軟件的應用,精通多門編程語…

前端開發中的SEO

前端開發中的SEO 什么是SEO SEO由英文Search Engine Optimization縮寫而來,中文意譯為“搜索引擎優化”。SEO是指從自然搜索結果獲得網站流量的技術和過程,是在了解搜索引擎自然排名機制的基礎上,對網站進行內部及外部的調整優化,…

grep命令

請見附件;轉載于:https://blog.51cto.com/11203760/1750457

windows 常用系統變量

常用: %USERPROFILE% C:\Users\用戶名 %SystemRoot% C:\WINDOWS %SystemDrive% C: %APPDATA% C:\Users\用戶名\AppData\Roaming %LOCALAPPDATA% C:\Users\用戶名\AppData\Local %windir% C:\WINDOWS %Path% C:\Windows\system32;C:\Wi…

C# 自定義并動態切換光標

本文經原作者授權以原創方式二次分享,歡迎轉載、分享。原文作者:唐宋元明清的博客原文地址:https://www.cnblogs.com/kybs0/p/14873136.html系統有很多光標類型 :Cursors 類 (System.Windows.Input) | Microsoft Docs[1]本章介紹如…

HTML基礎加強

1. 什么是瀏覽器:解釋和執行HTML源碼的工具。 2. 什么是靜態頁面,什么樣的頁面是動態頁面? 靜態頁面:htm,html(直接讀取) 動態網頁:asp,aspx,jsp,…

視頻播放器for android

寫在前面 好久沒有寫博客了, 中間忙了一堆雜七雜八的事情...工作, 情感, 未來, 人生... 下面是正文 一直要寫一個視頻播放器, 好練練手. 這個app, 從年前寫到現在, 終于算弄出了樣子, 0.0版本. (不得不說, googleVPN值得擁有, android developer網站, android sdk samples, sta…

我要偷偷學習C#,然后學習GIS二次開發之試題匯總(附答案)

一、單項選擇題(每小題2分,共20分) 在類作用域中能夠通過直接使用該類的( )成員名進行訪問。 A. 私有 B. 公用 C. 保護 D. 任何 答案:D 小數類型(decimal)和浮點類型都可以表示小數,正確說法:( ) A. 兩者沒有任何區別 B. 小數類型比浮點類型取值范圍大 C.小數類型比浮…

簡單粗暴無需拼接下載 blob (ts)視頻文件

網上很多視頻采用blob來播放視頻&#xff0c;查看源碼會發現video的src為形如 &#xff1a; src"blob:https://*/f2880c6a-c2c5-4146-96b2-944ae555b76a" <video id"" class"" preload"auto" playsinline"playsinline"…

System.CommandLine版CSRebot

之前自己實現過一個CSRebot命令行工具&#xff0c;現在用System.CommandLine來實現&#xff0c;就規范和省事多了&#xff0c;雖然System.CommandLine還沒有正式發布&#xff0c;但它的實現思路還是很不錯的。下面的代碼只簡單實現了MSSQL庫生成C#體類的功能&#xff0c;其他庫…

Shell重定向

Liunx下系統打開的3個文件&#xff0c;即標準輸入、標注輸出和標準錯誤輸出。用戶的shell將鍵盤設為默認的標準輸入&#xff0c;默認的標準輸入和標準錯誤輸出為屏幕。也就是說&#xff0c;用戶從鍵盤輸入命令&#xff0c;然后將結果和錯誤消息輸入到屏幕所謂的重定向&#xff…

【CASS精品教程】CASS 9.2 for AutoCAD2014啟動提示文件加載,怎么處理?

CASS9.2在安裝完后,首次啟動會提示如下圖樣提示,應該如何處理?請看以下步驟: 解決步驟: 1、安裝完CASS9.2_2014后,首次啟動CASS92,會出現如下圖所示提示。選擇“不加載”。 2、進入AutoCAD系統配置—系統頁面 打開系統頁面菜單 系統界面截圖

VS2015不能修改安裝路徑問題

能修改安裝路徑&#xff0c;固態硬盤空間太小&#xff0c;所以不能裝在C盤啊。 其中&#xff0c;原因是以前安裝過VS2015沒有卸載干凈&#xff0c;解決方法是&#xff1a;下載Visual Studio Uninstaller卸載完全&#xff08;要以管理員運行哈&#xff09; 下載地址&#xff1a;…

python 繪制分形樹

# -*- coding: utf8 -*- """ 繪制分形樹 """ import turtledeflection_angle 20 # 樹枝與樹干夾角 trunk_min_length 5 # 樹干最小長度 trunk_step_length 10 # 樹干每次遞減長度 trunk_length 80 # 初…

像JAVA一樣流暢調試C#源代碼?

起因最近在研究ServiceScope的內一些內在運行邏輯,發現相關資料非常少&#xff0c;只有講IOC相關的文章有說Core時代的官方依賴注入怎么使用。。遂決定還是要去看源代碼。這部分源代碼在Microsoft.Extensions.DependencyInjection庫中&#xff0c;源代碼位置在src/libraries[1]…

物化視圖VS普通視圖

2019獨角獸企業重金招聘Python工程師標準>>> 物化視圖是一種特殊的物理表&#xff0c;“物化”(Materialized)視圖是相對普通視圖而言的。普通視圖是虛擬表&#xff0c;應用的局限性大&#xff0c;任何對視圖的查詢&#xff0c;Oracle都實際上轉換為視圖SQL語句的查…

【CASS精品教程】CASS繪圖軟件入門初級教程超詳細資料

文章目錄 第一章 CASS 9.0簡介第二章 CASS 9.0快速入門第三章 測制地形圖第四章 測制地籍圖第五章 土地詳查與勘測定界第六章 CASS在數據入庫中的應用第七章 CASS 9.0在工程中的應用第八章 數字地圖管理第九章 CASS在市政監管中的應用第十章 白紙圖數字化第十一章電子平板成圖第…

多兼容的JS獲取鼠標坐標

//第一、相對于屏幕 function getMousePos(event) {var e event || window.event;return {x:e.screenX,y:screenY} } //第二、相對于瀏覽器 function getMousePos(event) {var e event || window.event;return {x:e.clientX,y:clientY} }//第三、相對于文檔 function getM…