為什么要使用工廠模式

工廠的作用相當于幫助我們完成實例化的操作。

優勢1:一般在代碼中,實例化一個類A是直接new A(),假如類A是一個完全獨立的類,沒有相似類,則沒有必要使用工廠模式,直接new A()沒有毛病。但是如果類A本身有一個相似類B,而在實際使用類A或者類B的實例時,如果關心的是類A與類B的共同部分,則工廠模式就可以體現出它的優勢。

比如調用數據庫,所有的數據庫都有插入操作insert:

interface DatabaseOperate{
?? ?public void insert(Mydata data){
?? ?}
}

然而,不同的數據庫的具體實現方法是不同的
class MySQLOperate implements DatabaseOperate{
?? ?@Override
?? ?public void insert(Mydata data){
?? ??? ?...
?? ?}
}
class OracleOperate implements DatabaseOperate{
?? ?@Override
?? ?public void insert(Mydata data){
?? ??? ?...
?? ?}
}
然而真正使用插入操作的時候,我們需要關心的并不是插入操作如何具體實現,我們只需要對數據庫進行插入操作就行了,所以使用工廠類對具體實現方法進行整合

class MyDBFactory{
?? ?
?? ?public static int MySQL=1;
?? ?public static int Oracle=2;
?? ?public static int DBType = MySQL;
?? ?public static DatabaseOperate getDatabase(){
?? ??? ?if(DBType=MySQL){
?? ??? ??? ?return new MySQLOperate();
?? ??? ?}
?? ??? ?
?? ??? ?if(DBType=Oracle){
?? ??? ??? ?return new OracleOperate();
?? ??? ?}
?? ?}
}
這樣我們在調用的時候就可以忽略具體實現方法,而直接進行調用。
void insert(Mydata data){
?? ?DatabaseOperate operate = MyDBFactory.getDatabase();
?? ?operate.insert(data);
}
在這里,工廠模式相當于實現了下面的代碼。
class MySQLOperate{
?? ?public void insert(Mydata data){
?? ??? ?...
?? ?}
}
void inert(Mydata data){
?? ?MySQLOperate opertate = new MySQLOperate();
?? ?operate.insert(data);
}
如果這樣編寫,在進行數據庫切換時,需要重新寫insert()方法,尤其是在很多地方用到與insert()方法相同的操作時,要在很多地方new MySQLOperate這個類,修改起來跟家麻煩。
這個優勢有兩個應用場景:

一個是上述的例子,可以動態的使用代碼,只需要修改部分配置。

還有一個是在一個大類需要很多小類的時候,每種小類負責完成一部分工作,但是有不同的完成方法,大類只需要設置條件,工廠自動返回合適的小類。

優勢2:初始化封裝。在需求一個類的實例時,假如需要一個相同屬性的實例,每次初始化的操作是一樣的,用工廠模式可以對初始化進行封裝,簡化操作。

比如有一個類Car

class Car{
?? ?private String brand;
?? ?private double price;
?? ?public Car(String brand,double price){
?? ? ? ?this.brand=brand;
? ? ? ? ? ? this.price=price;?? ?
?? ?}
}

我們在實例化一個Audi的時候,賦值brand為Audi,price為30000

void createCar(){
? ? Car car1 = new Car("Audi",300000);
? ? Car car2 = new Car("Audi",300000);
}
每次要用到Audi這個實例的時候,都要給定兩個初始化參數,"Audi"和30000,然而如果確定了brand為Audi的話,price隨之確定為300000,每次實例化的時候要輸入多個( 這里是兩個)參數,會顯得很麻煩。
所以我們這里使用工廠模式


public CarFactory

{
? ? private Map<String,Car> cars = new HashMap<>();
?
? ? static

? ?{
? ? ? ? cars.put("Audi",new Car("Audi",300000));
? ? }
? ??
? ? public static Car getCar(String name)

? ?{
? ? ? ? return cars.get(name);
? ? }
?
}
然后我們在實例化Audi時,只需要輸入他的名稱就可以得到參數完整的Audi


void createCar(){
? ? Car car1 = CarFactory.getCar("Audi");
? ? Car car2 = CarFactory.getCar("Audi");
}
這樣大大簡化了實例化時的初始化設置。


---------------------?
作者:zinsserzc?
來源:CSDN?
原文:https://blog.csdn.net/qq_28859325/article/details/60580578?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

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

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

相關文章

css各兼容應該注意的問題

1.div布局在ie瀏覽器和chrome瀏覽器&#xff0c;firefox瀏覽器不同&#xff0c;不如在div里面嵌套3個div&#xff0c;分別左中右&#xff0c;左邊div的pading和margin在ie8以上都是幾乎相同&#xff0c;ie8以下做內邊距x2&#xff0c;在中間的div在chrome和fierfox中默認在左邊…

轉 C++宏定義詳解

來自&#xff1a;傳送門 C宏定義詳解 一、#define的基本用法 #define是C語言中提供的宏定義命令&#xff0c;其主要目的是為程序員在編程時提供一定的方便&#xff0c;并能在一定程度上提高程序的運行效率&#xff0c;但學生在學習時往往不能 理解該命令的本質&#xff0c;總是…

acm之vim的基本配置

http://www.kuangbin.net/archives/vim-acmicpc 轉載于:https://www.cnblogs.com/akrusher/articles/5402426.html

40 個重要的 HTML5 面試問題及答案

2019獨角獸企業重金招聘Python工程師標準>>> 介紹 我是一個ASP.NET MVC開發人員。最近當我找工作的時候&#xff0c;我發現很多問題都是圍繞HTML 5和它的新功能展開的。所以&#xff0c;下面我將列出40個有助于你提高相關HTML 5知識的重要問題。 這些問題并不能保證…

Java常見Jar包的用途

jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用來發現、查找和實現可插入式接口&#xff0c;提供一些一般類實例化、單件的生命周期管理的常用方法. jaxrpc.jar Axis運行所需要的組件包 saaj.jar 創建到端點的點到點連接的方法、創建并處理SOAP消息和附件的方法…

車流檢測之halcon光流法算法實現

* This example program shows how to use optical_flow_mg to compute the optical flow in an image sequence and how to segment the optical flow. *這個示例程序顯示了如何使用._flow_mg來計算圖像序列中的光流&#xff0c;以及如何分割光流。 dev_update_off () dev_…

利用光學流跟蹤關鍵點---30

原創博客:轉載請標明出處:http://www.cnblogs.com/zxouxuewei/ 關鍵點&#xff1a;是多個方向上亮度變化強的區域。 opencv:版本是2.4. 光學流函數&#xff1a;calcOpticalFlowPyrLK()。&#xff08;關鍵點偵測器使用goodFeaturesToTrack()&#xff09;二者結合。 相應的啟動文…

基于Redis、Storm的實時數據查詢實踐

通過算法小組給出的聚合文件&#xff0c;我們需要實現一種業務場景&#xff0c;通過用戶的消費地點的商戶ID與posId&#xff0c;查詢出他所在的商圈&#xff0c;并通過商圈地點查詢出與該區域的做活動的商戶&#xff0c;并與之進行消息匹配&#xff0c;推送相應活動信息到用戶手…

從離散值中把值相近的放在一起

//30根細條得到30個長度值&#xff0c;選擇出現值相近且出現次數最多的&#xff0c;算其均值作為輸出 #include <iostream> using namespace std;int main() {double dRawdata[5] {1.1,1.2,1.3,2.5,3.2};//先升序排序double dSort[5][5] {0};double* p dRawdata;int a…

register_globals(全局變量注冊開關)

register_globals&#xff0c;是php.ini文件里面的一個配置選項&#xff0c;接下來&#xff0c;我們可以通過例程來分析一下&#xff0c;當register_globals on 與 register_globals off 的時候&#xff0c;對php語言的一些安全影響。測試源代碼如下&#xff1a;index.html 源…

精述IBM的MQTT協議和MQTT-S協議

一&#xff0e;MQTT簡介 MQTT (Message Queuing Telemetry Transport) 是由IBM研發的構建在TCP/IP之上的簡單輕量的消息協議&#xff0c;目標使用場景為受限制環境&#xff0c;如低帶寬、高延遲、不可靠網絡&#xff0c;很適用于M2M和IoT中。它的競爭協議包括XMPP協議和IETF的C…

20150103--SQL連接查詢+視圖-02

20150103--SQL連接查詢視圖-02 子查詢 一條查詢語句出現在另外一條查詢語句的內部&#xff0c;這條語句就被稱之為子查詢語句。 子查詢分類 子查詢可以根據子查詢返回的結果以及子查詢出現的位置兩種方式進行分類 按結果分類&#xff1a; 標量子查詢&#xff1a;子查詢返回的結…

QtQuick controls和controls2 自定義樣式

2019獨角獸企業重金招聘Python工程師標準>>> controls import QtQuick 2.7 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4Rectangle {color: "green"Button {id:buttontext: qsTr("Second page")anchors.centerIn: parentpr…

電腦開機3秒就重啟循環_電腦修好后客戶不愿支付上門費,行,那電腦開機60秒自動關機吧!...

上門維修電腦已經非常普及了&#xff0c;上門維修電腦費用要比送修(送到維修店)費用高&#xff0c;送修電腦只有一項維修費用&#xff0c;上門維修電腦比送修多了一項費用&#xff0c;這項費用就是上門費。有人說維修電腦收取上門費用不合理&#xff0c;其實這樣的說法非常自私…

jQuery屬性篩選選擇器

2019獨角獸企業重金招聘Python工程師標準>>> 代碼一 <h2>屬性篩選選擇器</h2><h3>[attval]、[att]、[att|val]、[att~val]</h3><div class"left" testattr"true" ><div class"div" testattr"t…

java 代碼優化

Java程序中的內存管理機制是通過GC完成的&#xff0c;“一個對象創建后被放置在JVM的堆內存中&#xff0c;當永遠不在應用這個對象的時候將會被JVM在堆內存中回收。被創建的對象不能再生&#xff0c;同時也沒有辦法通過程序語句釋放”&#xff08;這個是《Java的GC機制》中提到…

Halcon中OCR的實現及關鍵函數解析

OCR的實現共分為兩步&#xff0c;1是使用字符數據來訓練OCR。2是使用OCR進行字符的識別。 訓練分類器 訓練分類器共分為4步&#xff1a; 1是使用閾值來分割字符區域&#xff1b; 2是調用append_ocr_trainf函數將字符加入訓練集&#xff1b; 3是創建分類器&#xff1b; 4是…

MATLAB 長度和像素_Matlab中短時傅里葉變換 spectrogram和stft的用法

在Matlab中&#xff0c;做短時傅里葉變換需要使用函數spectrogram&#xff0c;而在Matlab2019中&#xff0c;引入了一個新的函數stft&#xff0c;下面我們就來看下這兩個函數都如何使用。短時傅里葉變換的基本原理就是將數據分段加窗&#xff0c;做fft&#xff0c;在分段時會有…

Qt 【關于控件樣式,鼠標進入、離開、點擊】

比如舉以下這個例子: QPushButton * okBtn; okBtn->setstylesheet("QPushButton{border-image:url(:/image/hello);}"); //這個是最常規的樣式 okBtn->setstylesheet("QPushButton{border-image:url(:/image/hello);}" //…