設計模式-工廠方法原型模板方法外觀

設計模式概述 - 工廠方法 & 原型 & 模板方法 & 外觀

工廠方法模式簡述

工廠方法模式(Factory Method Pattern)是一種創建型設計模式,它定義了一個用于創建對象的接口,但由子類決定實例化哪個類。工廠方法將類的實例化推遲到子類。

角色

  • 產品接口(Product):定義產品的接口。
  • 具體產品(ConcreteProduct):實現產品接口的具體類。
  • 工廠接口(Creator):定義創建產品的工廠方法。
  • 具體工廠(ConcreteCreator):實現工廠接口,返回具體產品的實例。

優點

  • 解耦:客戶端不需要知道具體產品的類,只需依賴于產品接口。
  • 擴展性:增加新產品時只需新增具體產品和具體工廠,而不需要修改已有代碼。

缺點

  • 類的數量增加:每增加一種產品,就需要增加一個具體產品和一個具體工廠,可能導致類的數量增加。
  • 復雜性:對于簡單的場景,使用工廠方法模式可能顯得過于復雜。

示例代碼

// 產品接口
interface Product {void use();
}// 具體產品A
class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using ConcreteProductA.");}
}// 具體產品B
class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using ConcreteProductB.");}
}// 工廠接口
abstract class Creator {public abstract Product factoryMethod();
}// 具體工廠A
class ConcreteCreatorA extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductA();}
}// 具體工廠B
class ConcreteCreatorB extends Creator {@Overridepublic Product factoryMethod() {return new ConcreteProductB();}
}// 客戶端代碼
public class Client {public static void main(String[] args) {Creator creatorA = new ConcreteCreatorA();Product productA = creatorA.factoryMethod();productA.use();Creator creatorB = new ConcreteCreatorB();Product productB = creatorB.factoryMethod();productB.use();}
}

原型模式簡述

原型模式(Prototype Pattern)是一種創建型設計模式,它通過復制現有的實例來創建新對象,而不是通過實例化一個新的對象。這種模式適用于創建相似對象的場景,尤其是在創建對象的成本較高時。

角色

  • 原型接口(Prototype):定義克隆方法。
  • 具體原型(ConcretePrototype):實現原型接口,提供具體的克隆方法。
  • 客戶端(Client):使用原型對象來創建新的對象。

優點

  • 性能提升:通過復制現有對象來創建新對象,避免了重復的初始化過程。
  • 簡化創建過程:可以通過克隆現有對象來簡化對象的創建過程。

缺點

  • 復雜性:實現克隆方法可能會增加代碼的復雜性,尤其是在對象包含復雜的成員時。
  • 深拷貝與淺拷貝:需要關注對象的拷貝方式,深拷貝和淺拷貝的選擇可能會影響對象的狀態。

示例代碼

// 原型接口
interface Prototype {Prototype clone();
}// 具體原型
class ConcretePrototype implements Prototype {private String name;public ConcretePrototype(String name) {this.name = name;}public String getName() {return name;}@Overridepublic Prototype clone() {return new ConcretePrototype(this.name);}
}// 客戶端代碼
public class Client {public static void main(String[] args) {ConcretePrototype original = new ConcretePrototype("Original");ConcretePrototype clone = (ConcretePrototype) original.clone();System.out.println("Original Name: " + original.getName());System.out.println("Cloned Name: " + clone.getName());}
}

模板方法模式簡述

模板方法模式(Template Method Pattern)是一種行為型設計模式,它定義了一個算法的骨架,并允許子類在不改變算法結構的情況下重新定義某些特定步驟。通過這種方式,模板方法模式可以實現代碼復用和算法的靈活性。

角色

  • 抽象類(AbstractClass):定義模板方法和一些基本操作的接口。
  • 具體類(ConcreteClass):實現抽象類中的某些操作,完成特定的算法步驟。

優點

  • 代碼復用:通過將算法的公共部分放在抽象類中,減少了代碼重復。
  • 靈活性:子類可以根據需要重寫某些步驟,靈活定制算法的具體實現。

缺點

  • 增加復雜性:模板方法模式可能會導致類的數量增加,從而增加系統的復雜性。
  • 限制擴展:子類只能重寫抽象類中定義的方法,可能會限制某些靈活性。

示例代碼

// 抽象類
abstract class AbstractClass {// 模板方法public final void templateMethod() {stepOne();stepTwo();stepThree();}// 基本方法protected abstract void stepOne();protected abstract void stepTwo();// 鉤子方法protected void stepThree() {System.out.println("Default Step Three Implementation.");}
}// 具體類A
class ConcreteClassA extends AbstractClass {@Overrideprotected void stepOne() {System.out.println("ConcreteClassA: Step One Implementation.");}@Overrideprotected void stepTwo() {System.out.println("ConcreteClassA: Step Two Implementation.");}
}// 具體類B
class ConcreteClassB extends AbstractClass {@Overrideprotected void stepOne() {System.out.println("ConcreteClassB: Step One Implementation.");}@Overrideprotected void stepTwo() {System.out.println("ConcreteClassB: Step Two Implementation.");}@Overrideprotected void stepThree() {System.out.println("ConcreteClassB: Custom Step Three Implementation.");}
}// 客戶端代碼
public class Client {public static void main(String[] args) {AbstractClass classA = new ConcreteClassA();classA.templateMethod();System.out.println();AbstractClass classB = new ConcreteClassB();classB.templateMethod();}
}

外觀模式簡述

外觀模式(Facade Pattern)是一種結構型設計模式,它為復雜的子系統提供一個統一的接口,使得子系統更易使用。通過外觀模式,客戶端可以通過一個簡單的接口與復雜的系統進行交互,從而降低系統的復雜性。

角色

  • 外觀類(Facade):提供一個簡單的接口,封裝了復雜的子系統。
  • 子系統類(Subsystem):實現具體的功能,通常由多個類組成。

優點

  • 簡化接口:通過提供統一的接口,簡化了子系統的使用。
  • 降低耦合:客戶端與子系統之間的依賴關系減少,提高了系統的可維護性。
  • 提高可讀性:外觀模式使得代碼的結構更加清晰,易于理解。

缺點

  • 可能導致功能膨脹:外觀類可能會變得過于復雜,承擔過多的責任。
  • 不符合開放-封閉原則:如果子系統發生變化,可能需要修改外觀類的實現。

示例代碼

// 子系統類A
class SubsystemA {public void operationA() {System.out.println("SubsystemA: Operation A");}
}// 子系統類B
class SubsystemB {public void operationB() {System.out.println("SubsystemB: Operation B");}
}// 子系統類C
class SubsystemC {public void operationC() {System.out.println("SubsystemC: Operation C");}
}// 外觀類
class Facade {private SubsystemA subsystemA;private SubsystemB subsystemB;private SubsystemC subsystemC;public Facade() {subsystemA = new SubsystemA();subsystemB = new SubsystemB();subsystemC = new SubsystemC();}public void simpleOperation() {subsystemA.operationA();subsystemB.operationB();subsystemC.operationC();}
}// 客戶端代碼
public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.simpleOperation();}
}

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

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

相關文章

推動檢測認證行業邁向智能化 AITIC一體機發布會在京舉辦

來源:新華社客戶端國家市場監督管理總局認證認可技術研究中心(簡稱“認研中心”)近日聯合技術合作伙伴在北京舉辦AITIC軟硬件一體機發布會。據了解,“AITIC一體機”是專為檢測認證行業設計的智能硬件,提供低成本的本地化部署方案,…

權限即數據:企業系統中的字段級訪問控制架構實戰(β=0.6)

摘要 這篇文章介紹了一個企業系統中的字段權限解析方案,通過規則表與命中記錄表(biz_rule_hit)聯動,實現對業務數據的動態權限控制。流程包括替換用戶上下文變量、記錄命中規則、查詢業務數據并關聯命中信息,最終在內存…

Python爬蟲實戰:研究Specialty Plots模塊,構建空氣質量監測數據采集和分析系統

1. 引言 1.1 研究背景 隨著全球城市化進程的加速和工業的快速發展,空氣質量問題已成為影響人類健康和生態環境的重要因素。世界衛生組織數據顯示,全球超過 90% 的人口生活在空氣質量超標的環境中,空氣污染每年導致約 700 萬人過早死亡。準確、及時地獲取和分析空氣質量數據…

字典樹算法

一、什么是Trie? Trie(發音為"try"),也稱為字典樹、前綴樹,是一種多叉樹結構,專門用于高效存儲和檢索字符串集合。其核心特點是共享字符串的公共前綴,從而大幅減少冗余存儲&#xff0…

Laya使用VideoNode動態加載視頻,可以自定義播放視頻此處以及位置

export class VideoCommand {video: Laya.VideoNode;public duration: number 0;/*** param videoPos 視頻位置* param videoSize 視頻大小*/public constructor(videoPos: Laya.Vector2, videoSize: Laya.Vector2) {this.video new Laya.VideoNode;//添加到舞臺 1是場景中的…

yum localinstall安裝本地包

yum localinstall 是一個用于安裝本地 RPM 包并自動處理依賴關系的命令。當你有一個或多個本地的 RPM 包需要安裝,又希望 yum 能幫你解決可能存在的依賴問題時,這個命令就非常有用。下面我會詳細解釋它的用法和注意事項。 ??? 命令基本用法 yum localinstall 命令的基本…

LeetCode 面試經典 150 題:輪轉數組(三次翻轉法詳解 + 多解法對比)

在數組類算法題中,“輪轉數組” 是一道考察 “原地操作” 與 “邏輯轉換” 能力的經典題目。所謂 “輪轉”,是指將數組元素向右移動指定步數,且超出數組長度的元素需 “循環” 到數組開頭。這道題的最優解 ——三次翻轉法,能以 O …

網絡編程---TCP

1.TCP:傳輸控制協議,位于傳輸層2.TCP的特性:a.使用流式套接字,數據連續,有順序b.TCP是可靠傳輸,有有應答機制ACK,即收到數據后會明確告知發送方已收到數據;若發送方沒有在預計時間收…

對計算機網絡模型的理解

文章目錄 目錄 前言 一、Internet 的核心特點 二、Internet 的組成結構 1. 硬件基礎:網絡運行的 “物理載體” 2. 軟件支撐:網絡運行的 “功能橋梁” 3. 協議規則:網絡運行的 “通用語言” 三、OSI 七層參考模型(理論標準&…

每日一算:分發糖果

在算法面試中,“分發糖果” 是一道經典的貪心算法應用題,核心考察對 “局部最優推導全局最優” 的理解。本文將從問題分析出發,提供兩種主流解題思路,并附上 C 實現代碼,幫助你徹底掌握這道題。一、問題重述題目要求有…

【WorkManager】無法在 Direct Boot 模式下初始化

【WorkManager】無法在 Direct Boot 模式下初始化一、問題描述二、問題分析2.1 關于 Direct Boot 模式2.2 支持 Direct Boot 模式2.3 手動初始化 WorkManager 組件2.4 WorkManager 不支持 Direct Boot 的官方修改三、解決方案一、問題描述 在使用 WorkManager 庫來實現開機上報…

Hybrid應用性能優化實戰分享(本文iOS 與 H5為例,安卓同理)

前言在移動應用開發中,Hybrid 架構因其跨平臺特性和開發效率優勢被廣泛采用。然而,WebView 的性能問題一直是開發者面臨的挑戰。本文將基于實際項目經驗,分享 iOS Hybrid 應用的核心優化策略,涵蓋 WebView 池化、預加載、用戶體驗…

點積、叉積、矩陣行列式詳解、線性相關與線性無關、矩陣的秩、矩陣可逆與不可逆詳解

1.向量 1.1 點積(Dot Product) 1.1.1 定義 點積是在求一個標量,點積結果沒有方向。 對于兩個向量u(u1,u2,u3),v(v1,v2,v3)\bold{u}(u_1,u_2,u_3),\bold{v}(v_1,v_2,v_3)u(u1?,u2?,u3?),v(v1?,v2?,v3?) 點積定義為:u?vu1v1u…

Mac安裝nvm詳細教程(超簡單)

本章教程,主要介紹如何在Mac操作系統上安裝nvm. 我們使用官方一鍵安裝腳本,完成安裝 一、安裝步驟 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash配置環境變量,編輯.zshrc文件 vim .zshrcexport NVM_DIR="$(

【selenium】網頁元素找不到?從$(‘[placeholder=“手機號“]‘)說起

網頁元素找不到?從$(‘[placeholder“手機號”]’)說起總結:控制臺不騙人,元素選不到,八成是寫法、時機或環境的問題。我們在寫網頁自動化腳本或者調試頁面的時候,經常遇到一個讓人頭疼的問題:明明元素就在…

SSE 模仿 GPT 響應

后端代碼 const express require(express) const cors require(cors);const app express(); app.use(cors()); const port 3000;app.listen(port, () > {console.log(Server running at http://localhost:${port}/); });const msg 全國同胞們, 尊敬的各位國…

MAC 多個版本 JDK進行切換

1.查看本機所有的jdk/usr/libexec/java_home -V2、打開bash_profile文件。可以在終端vim ~/.bash_profile打開,也可以打開訪達shiftcmdG然后輸入/Users/mac/.bash_profile(本機bash_profile的路徑)加入新的環境變量格式如下(參考我…

shell 中 expect 詳解

一、概述Expect是一個免費的編程工具語言,用來實現自動和交互式任務進行通信,而無需人的干預。Expect的作者DonLibes在1990年開始編寫Expect時對Expect做有如下定義:Expect是一個用來實現自動交互功能的軟件套件。通過expect系統管理員可以創…

第4講 機器學習基礎概念

機器學習作為人工智能的子領域,專注于訓練計算機算法自動發現數據中的模式與關聯關系。以下是其核心基礎概念:4.1 數據數據是機器學習的基石。缺乏數據,算法將無從學習。數據可呈現為結構化數據(如電子表格、數據庫)和…

Go組合式繼承:靈活替代方案

Go 語言沒有傳統面向對象編程中的繼承機制,但通過組合和接口實現類似功能。Go 更提倡組合優于繼承的設計原則,這種設計方式更靈活且易于維護。結構體組合(偽繼承)通過嵌套結構體實現類似繼承的效果。子結構體可以直接訪問父結構體…