設計模式之簡單工廠模式Simple Factory(四創建型)

来源:http://www.cnblogs.com/accipiter/archive/2016/01/19/5143539.html
-Advertisement-
Play Games

工廠模式簡介。工廠模式專門負責將大量有共同介面的類實例化工廠模式可以動態決定將哪一個類實例化,不必事先知道每次要實例化哪一個類。工廠模式有三種形態:1、簡單工廠模式Simple Factory,又稱靜態工廠方法模式2、工廠方法模式Factory Method,又稱多態性工廠模式3、抽象工廠模式Abs...


  1. 工廠模式簡介。

    工廠模式專門負責將大量有共同介面的類實例化

    工廠模式可以動態決定將哪一個類實例化,不必事先知道每次要實例化哪一個類。

    工廠模式有三種形態:

    1、簡單工廠模式Simple Factory,又稱靜態工廠方法模式

    2、工廠方法模式Factory Method,又稱多態性工廠模式

    3、抽象工廠模式Abstract Factory,又稱工具箱模式

2、什麼是簡單工廠模式

簡單工廠模式是類的創建模式。是由一個工廠對象決定創建出哪一種產品類的實例,是不同的工廠方法模式的一個特殊實現。由一個工廠對象決定創建出哪一種產品類的實例,負責將大量有共同介面的類實例化。

3、使用實例

一個農場公司,專門向市場銷售各類水果。系統中需要描述下列水果:

1蘋果Apple

2葡萄Grape

3草莓Strawberry

水果與其他的植物不同,為與農場的其他植物區分開,可建立一個各種水果都適用的水果介面,該介面規定出水果類均需具備的方法:種植plant()、生長grow()以及收穫harvest()。

類圖如下:

具體實現類如下:

Fruit類:

/**
* @FileName Fruit.java
* @Package com.ali.pattern.factory.simplefactory
* @Description TODO[what the file to do]
* @Author ali blog:http://www.cnblogs.com/accipiter
* @Date 2016年1月19日下午8:15:49
* @Version V1.0.1
*/
package com.ali.pattern.factory.simplefactory;

/**
 * @ClassName Fruit
 * @Description 一個各種水果都適用的水果介面,該介面規定出水果類均需具備的方法
 * @Date 下午8:15:49
 */
public interface Fruit {
    public void plant();
    public void grow();
    public void harverst();
}

 

FruitGardener類:

/**
* @FileName FruitGardener.java
* @Package com.ali.pattern.factory.simplefactory
* @Description TODO[what the file to do]
* @Author ali blog:http://www.cnblogs.com/accipiter
* @Date 2016年1月19日下午8:32:34
* @Version V1.0.1
*/
package com.ali.pattern.factory.simplefactory;

import com.ali.pattern.factory.simplefactory.impl.Apple;
import com.ali.pattern.factory.simplefactory.impl.Grape;
import com.ali.pattern.factory.simplefactory.impl.Strawberry;

/**
 * @ClassName FruitGardener
 * @Description TODO
 * @Date 下午8:32:34
 */
public class FruitGardener {
    public static Fruit factory(String which){
        if(which.equals("apple")){
            return new Apple();
        }else if(which.equals("grape")){
            return new Grape();
        }else if(which.equals("strawberry")){
            return new Strawberry();
        }else{
            return null;
        }
    }
}

Apple類:

/**
* @FileName Apple.java
* @Package com.ali.pattern.factory.simplefactory.impl
* @Description TODO[what the file to do]
* @Author ali blog:http://www.cnblogs.com/accipiter
* @Date 2016年1月19日下午8:25:14
* @Version V1.0.1
*/
package com.ali.pattern.factory.simplefactory.impl;

import com.ali.pattern.factory.simplefactory.Fruit;

/**
 * @ClassName Apple
 * @Description TODO
 * @Date 下午8:25:14
 */
public class Apple implements Fruit {

    @Override
    public void plant() {
        System.out.println("Plant apple.");
    }

    @Override
    public void grow() {
        System.out.println("grow apple.");
        
    }

    @Override
    public void harverst() {
        System.out.println("harverst apple.");
    }

}

 

4、簡單工廠模式的特點:

在簡單工廠模式中,可以根據參數的不同返回不同類的實例。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。

將對象的創建和對象本身業務處理分離可以降低系統的耦合度,使得兩者修改起來都相對容易。

在調用工廠類的工廠方法時,由於工廠方法是靜態方法,使用起來很方便,可通過類名直接調用,而且只需要傳入一個簡單的參數即可,在實際開發中,還可以在調用時將所傳入的參數保存在XML等格式的配臵文件中,修改參數時無須修改任何Java源代碼。

簡單工廠模式最大的問題在於工廠類的職責相對過重,增加新的產品需要修改工廠類的判斷邏輯,這一點與開閉原則是相違背的。

簡單工廠模式的要點在於:當你需要什麼,只需要傳入一個正確的參數,就可以獲取你所需要的對象,而無須知道其創建細節。

優點:

1、模式的核心是工廠類,該類中含有必要的判斷邏輯,可以決定在什麼時候創建哪一個產品類的實例,客戶端可以免除直接創建產品對象的責任,而僅僅負責"消費"產品。

2、簡單工廠模式實現了對責任的分割。

缺點:

  1. 由於工廠類集中了所有產品創建邏輯,一旦不能正常工作,整個系統都要受到影響。

2、使用簡單工廠模式將會增加系統中類的個數,在一定程式上增加了系統的複雜度和理解難度。

3、系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,在產品類型較多時,有可能造成工廠邏輯過於複雜,不利於系統的擴展和維護。

4、簡單工廠模式由於使用了靜態工廠方法,造成工廠角色無法形成基於繼承的等級結構。

========博客園管理員似乎不太喜歡設計模式的文章,也許是太多了吧,不過都的學一遍====================================


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • #coding:utf-8import os,repath = 'test'files = os.listdir(path)def count_word(words): dic = {} max = 0 marked_key = '' #計算每個單詞出現的次數 for ...
  • 一、簡介 如果有一種軟體能將圖形界面的設計及時地展現於開發人員的面前,而且在設計完後能直接看到界面的外觀效果,這樣就使程式員的主要精力集中於應用程式核心功能的開發上,這就是所謂的可視化編程思想。 二、安裝 1)yum方式 yum install -y glade3 三、教程 http://www.4...
  • 歸併排序就是將未排序的數組進行對半劃分成兩個數組,劃分後的數組只有原來數組的一半數量的元素。然後在對劃分的兩個數組再繼續劃分,迴圈此操作,直到劃分的數組中只有一個元素時停止劃分,然後對於劃分完成的數組進行歸併排序操作。將兩個已經劃分完成的數組合併成一個有序的數組,直到最後合併成一個包含所有元素的數組...
  • 1.pom 項目對象模型 (project object model) pom的組成 1.項目基本信息 2.構建環境 --dev,test,beta,prod 3.pom關係 --依賴jar包 4.構建設置 -- plugin 插件2.插件與目標 調用插件目標的兩種方式: ...
  • 1、常用的五種併發包ConcurrentHashMapCopyOnWriteArrayListCopyOnWriteArraySetArrayBlockingQueueLinkedBlockingQueue2、ConcurrentHashMap線程安全的HashMap的實現數據結構:一個指定個數的S...
  • Day2401 TCP上傳圖片02 客戶端併發上傳圖片03 客戶端併發登錄04 瀏覽器客戶端-自定義服務端05 瀏覽器客戶端-Tomcat服務端01 TCP上傳圖片 1 import java.net.*; 2 import java.io.*; 3 class PicClient 4 { 5 .....
  • [1] 比較了常見的應用伺服器和Web伺服器。 [2] 介紹了在項目構建中,應用伺服器和Web伺服器所承擔的不同作用。
  • 設計模式系列都是學習HeadFirst設計模式得出的學習心得,中間的例子也會採用書中的例子。這裡有必要解釋一下,在下麵星巴克咖啡的例子中,有幾種基本的咖啡,還有牛奶、豆漿等等可以向咖啡中添加,這裡說明防止下麵不懂。 今天我們來瞭解一下裝飾者模式。 回想一下java的io包,各種stream排...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...