java靜態工廠方法模式_設計模式:簡單工廠模式(靜態工廠方法模式)

簡單工廠的構成包括三個角色:

1)抽象產品類

2)具體產品類(繼承抽閑產品類)

3)工廠類(生產具體產品)

具體代碼實現

c6c138858840fd2cd290fbbf6b816596.png

1、抽象產品類

/**

* 抽象類

*/

public abstract class Car {

/**

* 產品抽象方法,將會由具體產品類實現

*/

public abstract void driving();

}

2、具體產品類

/**

* 具體產品類BenZCar

*/

public class BenZCar extends Car {

@Override

public void driving() {

System.out.println("BenZCar is Driving!!!");

}

}

/**

* 具體產品類BMWCar

*/

public class BMWCar extends Car {

@Override

public void driving() {

System.out.println("BMWCar is Driving!!!");

}

}

3、工廠類

/**

* 簡單工廠類

*/

public class CarFactory {

public static Car create(String type) {

Car car = null;

switch (type) {

case "bmw":

car = new BMWCar();

break;

case "benz":

car = new BenZCar();

break;

}

return car;

}

}

4、調用(這里使用AndroidStudio代碼測試,如果是java的可以在main函數中測試)

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.id_bmw).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

CarFactory.create("bmw").driving();

}

});

findViewById(R.id.id_benz).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

CarFactory.create("benz").driving();

}

});

}

}

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/id_bmw"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="制造一個BWM汽車"

android:layout_marginBottom="15dp"/>

android:id="@+id/id_benz"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="制造一個Benz汽車"

android:layout_marginBottom="15dp"/>

5、界面

4bc89a982c684db20c3c093a55e9303c.png

6、測試結果

08-20 10:59:55.001 3660-3660/com.tech.aile.designpatterns I/System.out: BMWCar is Driving!!!

08-20 10:59:56.573 3660-3660/com.tech.aile.designpatterns I/System.out: BenZCar is Driving!!!

7、使用場景

1)工廠類創建的具體對象要較少,不適用子類過多,子類層級過深的場景。

2)看客戶只需要傳入什么類型的參數,不用關注創建對象的邏輯。

8、優點

根據參數類型獲取實例,不用關注具體細節,降低了耦合

9、缺點

具體的產品類型在編譯期間已經確定,不能更改,如果需要新增具體產品就需要修改工廠類,添加新具體產品類,違背了封閉開放原則;

簡單工廠必須知道所有需要生產具體產品類,不適用子類過多,子類層級過深的場景

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

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

相關文章

Kibana中的Coordinate Map地圖報索引錯誤的問題

今天做地圖定位展示,展示的是ApacheWeb服務器的訪問日志文件中的來源IP。但是中間出現了報錯環節,說是索引不能匹配到geo_point類型,實在是不懂這是在說什么,后來在網站找了方法就解決了。主要報錯如下: 報錯信息&…

mysql數據庫安裝在unix_Linux下的數據庫二:在Linux/Unix平臺安裝MySQL

推薦使用RPM工具來進行Linux下的MySQL數據庫安裝。目前的MySQLrpm安裝文件包是在SuSE Linux7.3系統平臺上打造而成的,但是在絕大多數支持RPM和glibc的其他Linux平臺中也可以進行安裝。如果選擇通用的RPM安裝包,那么RPM將靜態鏈接到Linux的線程中。下面步…

mysql時區設置gmt_將MySQL數據庫時區設置為GMT

不,不可能在MySQL實例中更改單個數據庫的時區.您可以檢索服務器和客戶端time_zone設置:SELECT global.time_zone, session.time_zone;您還可以更改整個MySQL實例的客戶端時區或時區.但要敏銳地了解現有客戶端連接的含義,以及如何解釋已存儲在實例中的DATETIME和TIME…

javaSE知識點匯總

javaSE知識點匯總Java基礎知識精華部分寫代碼:1,明確需求。我要做什么?2,分析思路。我要怎么做?1,2,3。3,確定步驟。每一個思路部分用到哪些語句,方法,和對象。4,代碼實現…

java中412是什么錯_HTTP 412 錯誤 – 先決條件失敗 (Precondition failed)

HTTP 412 錯誤 – 先決條件失敗 (Precondition failed)介紹您的 Web 服務器認為,該服務器檢測到客戶端發送的 HTTP 數據流包括一個沒有滿足的‘先決條件’規范。HTTP 循環中的 412 錯誤任何客戶端 ( 例如您的瀏覽器或我們的 CheckUpDown 機器人 ) ,都需要…

細談頁面回流與重繪

你將了解到: 什么是回流 什么是重繪 回流何時發生 重繪何時發生 如何避免回流和重繪 復制代碼帶著上面的問題,我們一探究竟 什么是回流 回流:英文是reflow 當render tree中的一部分(或全部),因為元素的規模尺寸、布局、隱藏等改變…

安卓 java中改布局_android-選項卡布局中的地圖視圖throwing,java....

我創建了一個具有選項卡布局的應用程序,單擊選項卡后,我將打開一個使用Web視圖的新活動.另外另一個選項卡使用地圖視圖,列表視圖,圖像視圖.現在,我在Samsung Galaxy Y上安裝了我的應用程序-運行正常.當我在Samsung Galaxy Tab 2上安裝相同的應用程序時,當我第一次打開地圖視圖,…

怎么樣修改PuTTY的默認字體和字符集

1.在窗口標題上點擊右鍵,選擇 Change Settings...2.在打開的配置窗口左邊選擇 Appearance,在右邊點 Font settings 里面的 Change 按鈕,選擇好中文字體,比如:宋體、新宋體之類的3.選擇配置窗口左邊的 Translation&…

python 元組比較大小_為什么元組比列表更快?

所報道的“build設速度”比率只適用于常量元組(項目用文字表示)。 仔細觀察(并在機器上重復 – 只需在shell /命令窗口input命令!)…:$ python3.1 -mtimeit -sx,y,z1,2,3 [x,y,z] 1000000 loops, best of 3: 0.379 usec per loop $ python3.1 -mtimeit […

windows軟鏈接的建立及刪除

2019獨角獸企業重金招聘Python工程師標準>>> 1.建立舉例 # 建立d:develop鏈接目錄,指向遠程的目標服務器上的e盤的對應目錄。 mklink /d d:\develop \\138.20.1.141\e$\develop# 建立d:develop鏈接目錄,指向遠程的目標服務器上的e盤的對應目錄…

php原生類,反序列化之PHP原生類的利用

正文文章圍繞著一個問題,如果在代碼審計中有反序列化點,但是在原本的代碼中找不到pop鏈該如何?N1CTF有一個無pop鏈的反序列化的題目,其中就是找到php內置類來進行反序列化。基礎知識首先還是來回顧一下序列化中的魔術方法,下面也…

Spectral Bounds for Sparse PCA: Exact and Greedy Algorithms[貪婪算法選特征]

目錄 概括Sparse PCA Formulation非常普遍的問題Optimality ConditionsEigenvalue Bounds算法代碼概括 這篇論文,不像以往的那些論文,構造優化問題,然后再求解這個問題(一般都是凸化)。而是,直接選擇某些特…

js php調用webservice,php調用web services兩種方法soap和curl

以http://www.webxml.com.cn/zh_cn/index.aspx一、使用soap調用//服務器支持soap擴展:/*Example 1:$client new SoapClient("http://fy.webxml.com.cn/webservices/EnglishChinese.asmx?wsdl");$parameters array("wordKey">"test");//中英…

JS基礎-3

1.for in 對象中有多少組鍵值對,我們的FOR IN 循環就遍歷多少次(不一定) 每一次循環KEY這個變量存儲的都是當前循環這組鍵對值的屬性名 1、KEY存儲的值都是字符串格式的(不管屬性名是否為數字) 2、在FOR IN 循環遍歷的時候,大部分瀏覽器都是先把對象中的鍵值對進行排…

Python常用的幾個函數

print()函數:用于打印輸出信息到控制臺。 input()函數:用于從控制臺獲取用戶輸入。 len()函數:用于獲取字符串、列表、元組、字典等對象的長度。 range()函數:用于生成一個整數序列,常用于循環中。 type()函數&…

數據結構——常見的定義

問題答案Ο標記法(大Ο標記法)是一種用于衡量算法時間復雜度的表示方法。它描述了算法在最壞情況下的運行時間增長率。當我們使用Ο標記法時,我們關注的是算法的上界,即算法的運行時間不會超過Ο(f(n)),其中 f(n) 是輸…

TikTok與環保:短視頻如何引領可持續生活方式?

在數字時代,社交媒體平臺扮演著塑造文化和價值觀的關鍵角色。而TikTok,作為一款全球短視頻平臺,不僅塑造著用戶的娛樂方式,還在悄然地引領著可持續生活方式的潮流。本文將深入探討TikTok與環保之間的關系,分析短視頻如…

Spring源碼分析---Bean 的生命周期 03

來源:Spring 3. Bean 的生命周期 自定義一個 SpringBoot 的主啟動類: SpringBootApplication public class A03Application {public static void main(String[] args) {ConfigurableApplicationContext context SpringApplication.run(A03Applicatio…

go-carbon v2.3.0 圣誕特別版發布,輕量級、語義化、對開發者友好的 Golang 時間處理庫

go-carbon v2.3.0 圣誕節特別版發布,這應該是 2023 年的最后一個版本,祝大家圣誕節快樂! carbon 是一個輕量級、語義化、對開發者友好的 golang 時間處理庫,支持鏈式調用。 目前已被 awesome-go 收錄,如果您覺得不錯…

pytorch 實現 Restormer 主要模塊(多頭通道自注意力機制和門控制結構)

前面的博文讀論文:Restormer: Efficient Transformer for High-Resolution Image Restoration 介紹了 Restormer 網絡結構的網絡技術特點,本文用 pytorch 實現其中的主要網絡結構模塊。 1. MDTA(Multi-Dconv Head Transposed Attention:多頭…