設計模式(二)-創建者模式(5)-建造者模式

一、為何需要建造者模式(Builder)?

在軟件系統中,會存在一個復雜的對象,復雜在于該對象包含了很多不同的功能模塊。該對象里的各個部分都是按照一定的算法組合起來的。
為了要使得復雜對象里的各個部分的獨立性,以及將它們組合在一起的算法需要保持固定(不會輕易改變其算法邏輯),不會隨著新需求改變從而改變原有的邏輯。此時就需要用建造者模式了。

特點:
將一個復雜對象的構建和其各個部分之間分離,在同一個算法組合里可以創建出不同的對象。

  • 部件的算法組合、對象的構建、部件的實現之間進行分離。

結構

  • 產品類(Product):存在產品的所有部件屬性,需要用來創建的復雜對象。
  • 建造創建者類(Builder):抽象類,定義復雜對象的部件創建的規范(抽象方法)。
  • 具體創建類(ConCreateBuilder):實現 Builder 接口方法,完成具體產品的創建。并且
  • 指揮者類(Director):由指揮者類來調用具體創建者類的方法按照一定的順序來組裝,返回完整的對象產品。

適合應用場景的特點:

  • 產品類里具有不同型號產品的共同屬性。(如下文例子中的漸變顏色,形狀)
  • 部件的型號不同,創建的邏輯也很可能不相同。(如有不同的代碼邏輯來創建形狀Point)
  • 部件的組合方式是固定的。(如設置漸變顏色和形狀的組合算法是固定的)

請添加圖片描述

二、例子

需求:

實現一個畫圖程序。根據不同形狀和不同漸變顏色來創建一個圖形。比如,創建一個紅橙按比例 50:100 漸變的矩形;創建一個白灰黑按比例 50:70:100 漸變的三角形。(為了方便理解,下面例子不寫得過于復雜,就不使用 Graphics 和 Pen 的復雜方式繪圖,而使用 Point 數組進行簡單繪圖)

1、產品:

    //產品類里具有不同型號產品的共同屬性。public sealed class Sharp{public Point[] point { get; private set; }public List<Colors> colors { get; private set; }public void setPoint(Point[] p) { point = p; }public void setColors(List<Colors> colors) { this.colors = colors; }}//Sharp 屬性:形狀public struct Point{public double x;public double y;}//Sharp 屬性:漸變顏色public class Colors{public string Rgb { get; set; }public double GradientValue { get; set; }public Colors(string rgb,double gradient){Rgb = rgb;GradientValue = gradient;}}

2、抽象建造者:


public abstract class Builder{protected Sharp Sharp { get; set; }public Builder(){Sharp = new Sharp();}public Sharp GetSharp(){return Sharp;}//部件的組合方式是固定的public abstract void BuilderSharp();public abstract void BuilderColors();}

3、構造建造者(具體創建者):


//矩形構造者public class RectSharpBuilder : Builder{//部件的型號不同,創建的邏輯也很可能不相同。同下public override void BuilderSharp(){Point[] point = new Point[4];point[0].x = 0; point[0].y = 0;point[1].x = 0; point[1].y = 10;point[2].x = 10; point[2].y = 0;point[3].x = 10; point[3].y = 10;Sharp.setPoint(point);}public override void BuilderColors(){List<Colors> colors = new List<Colors>(){new Colors("Red",50),new Colors("Orange",100)};Sharp.setColors(colors);}}//三角形構造者public class TriangleSharpBuilder : Builder{public override void BuilderSharp(){Point[] point = new Point[3];point[0].x = 0; point[0].y = 10;point[1].x = 5; point[1].y = 0;point[2].x = 10; point[2].y = 10;Sharp.setPoint(point);}public override void BuilderColors(){List<Colors> colors = new List<Colors>(){new Colors("White",50),new Colors("Gray",70),new Colors("Black",100)};Sharp.setColors(colors);}}

4、指導者:


public class Director{  public Sharp BuildSharp(Builder builder){builder.BuilderSharp();builder.BuilderColors();return builder.GetSharp();}}

5、主程序:


class Program{static void Main(string[] args){Director director = new Director();Builder RectSharp = new RectSharpBuilder();Builder TriangleSharp = new TriangleSharpBuilder();director.BuildSharp(RectSharp);director.BuildSharp(TriangleSharp);Console.ReadLine();}}

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

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

相關文章

騰訊物聯網平臺之規則引擎

1.騰訊物聯網平臺簡介 騰訊云物聯網開發平臺&#xff08;IoT Explorer&#xff09;為客戶提供便捷的物聯網開發工具與服務&#xff0c;助力客戶更高效的完成設備接入&#xff0c;并為客戶提供物聯網應用開發及場景服務能力&#xff0c;幫助客戶高效、低成本構建物聯網應用。 ?…

SpringBoot集成系列--RabbitMQ

文章目錄 一、代碼1、添加依賴2、配置RabbitMQ連接3、RabbitMQ配置4、創建生產者5、創建消費者6、測試 二、遇到的問題1、Channel shutdown2、收不到信息3、安裝RabbitMQ&#xff0c;無法訪問控制臺訪問 一、代碼 1、添加依賴 在pom.xml文件中添加RabbitMQ的相關依賴 <de…

uniapp flex:1不生效

包裹view頂層 不能添加 display: flex;<template><view class"container"><tHeader :title"采購管理" :showScrollTar"true" :scroll"scroll" :tabList"tabList" :isFixed"true"change"chang…

<軟考高項備考>《論文專題 - 2 項目選材》

1 AI輔助寫作 AI技術輔助論文寫作包括&#xff1a; 1、百度-文心一言 2、阿里-千義通問 3、科大訊飛-星火認知大模型 4、騰訊-混元大模型 5、ChatGPT 可以輔助論文的選題&#xff0c;架構理論部分的思路&#xff0c;熟悉了解項目中的難點和痛點&#xff0c;拓寬論文的寫作思路…

跟我學c++高級篇——靜態反射實現之二函數接口實現

一、函數反射 在實際的編程中&#xff0c;類和結構體應用最多&#xff0c;但也最難。這里先分析函數反射&#xff0c;類和結構體放到后面在分析。函數是什么&#xff1f;其實在PC看來就是一個地址&#xff0c;在編譯順看來就是一個符號&#xff08;廢話啊&#xff09;。函數反…

Leetcode—228.匯總區間【簡單】

2023每日刷題&#xff08;五十六&#xff09; Leetcode—228.匯總區間 解題思路 我們可以用雙指針left 和 right找出每個區間的左右端點。 遍歷數組&#xff0c;當right 1< n 且 nums[right1]nums[right]1 時&#xff0c;指針right向右移動&#xff0c;否則區間 [left, …

Mysql8和Oracle實際項目中遞歸查詢樹形結構

背景&#xff1a; 項目升級&#xff0c;引入MySQL數據庫&#xff0c;之前一直用的是Oracle數據&#xff0c;在做用戶登錄單位維護的時候&#xff0c;需要返回該用戶所屬單位下的所有子單位。下邊是模擬項目數據實踐的過程。 數據準備&#xff1a; 準備一張單位表&#xff0c…

Flask存儲在內存中的密鑰被讀取

局限性&#xff1a;查找的密鑰具有特征碼 一、Flask環境源碼 1.Flask主文件main.py import os import uuid from flask import Flask, request, session, render_template from cat import catflag "" app Flask(__name__,static_url_path/,static_folderstatic …

51.Go操作kafka示例(kafka-go庫)

文章目錄 一、簡介二、生產者三、消費者 代碼地址&#xff1a;https://gitee.com/lymgoforIT/golang-trick/tree/master/31-kafka-go 一、簡介 之前已經介紹過一個操作kafka的go庫了&#xff0c;28.windows安裝kafka&#xff0c;Go操作kafka示例&#xff08;sarama庫&#xf…

二叉搜索樹的最近公共祖先【數據結構】

二叉搜索樹的最近公共祖先 題目描述 給定一棵二叉搜索樹的先序遍歷序列&#xff0c;要求你找出任意兩結點的最近公共祖先結點&#xff08;簡稱 LCA&#xff09;。 輸入 輸入的第一行給出兩個正整數&#xff1a;待查詢的結點對數 M&#xff08;≤ 1 000&#xff09;和二叉搜索…

基于JavaWeb+SpringBoot+Vue在線拍賣系統的設計和實現

基于JavaWebSpringBootVue在線拍賣系統系統的設計和實現 源碼獲取入口Lun文目錄前言主要技術系統設計功能截圖訂閱經典源碼專欄Java項目精品實戰案例《500套》 源碼獲取 源碼獲取入口 Lun文目錄 摘 要 1 Abstract 1 1 系統概述 4 1.1 概述 4 1.2課題意義 4 1.3 主要內容 4 2 …

Git命令---綁定遠程倉庫

介紹 使用git命令綁定遠程倉庫 命令 git remote add origin https://gitee.com/x.xx.com/test.git

什么是多態

/*** Description 什么是多態*/ package com.oop;import com.oop.demo06.Person; import com.oop.demo06.Student;public class Application {public static void main(String[] args) {//一個對象的實際類型是確定的//new Student();//new Person();//可以指向的引用類型就不確…

C++新經典模板與泛型編程:策略技術中的算法策略

策略技術中的算法策略 在之前博客中funcsum()函數模板中&#xff0c;實現了對數組元素的求和運算。求和在這里可以看作一種算法&#xff0c;擴展一下思路&#xff0c;對數組元素求差、求乘積、求最大值和最小值等&#xff0c;都可以看作算法。而當前的funcsum()函數模板中&…

MySQL使用教程

數據構成了我們日益數字化的社會基礎。想象一下&#xff0c;從移動應用和銀行系統到搜索引擎&#xff0c;再到如 ChatGPT 這樣的先進人工智能聊天機器人&#xff0c;這些工具若沒有數據支撐&#xff0c;將寸步難行。你有沒有好奇過這些海量數據都存放在哪里呢&#xff1f;答案正…

2023年團體程序設計天梯賽——總決賽題

F-L1-1 最好的文檔 有一位軟件工程師說過一句很有道理的話&#xff1a;“Good code is its own best documentation.”&#xff08;好代碼本身就是最好的文檔&#xff09;。本題就請你直接在屏幕上輸出這句話。 輸入格式&#xff1a; 本題沒有輸入。 輸出格式&#xff1a; 在一…

讀excel文件,借助openpyxl工具

讀excel文件&#xff0c;借助openpyxl工具 import osimport requestsos.environ["http_proxy"] "http://127.0.0.1:7890" os.environ["https_proxy"] "http://127.0.0.1:7890"base_url "https://testnet.starscan.io/explore…

ALNS4VRPTWTF

文章概述 文章研究了城市物流背景下帶有第三方轉運設施的車輛路徑問題。與經典的車輛路徑問題不同&#xff0c;這些問題提供了將客戶需求交付給第三方轉運設施&#xff08;如城市集散中心&#xff09;的選擇&#xff0c;并收取一定的費用。為了解決這些挑戰&#xff0c;該研究…

LeetCode 279完全平方數 139單詞拆分 卡碼網 56攜帶礦石資源(多重背包) | 代碼隨想錄25期訓練營day45

動態規劃算法6 LeetCode 279 完全平方數 2023.12.11 題目鏈接代碼隨想錄講解[鏈接] int numSquares(int n) {//1確定dp數組&#xff0c;其下標表示j的完全平方數的最少數量//3初始化&#xff0c;將dp[0]初始化為0&#xff0c;用于計算&#xff0c;其他值設為INT_MAX用于遞推…

物料分類帳概覽

原文地址&#xff1a;Overview: What is SAP Material Ledger? | SAP Blogs 物料分類賬是收集物料主數據存儲在物料主數據中的物料交易數據的工具。 物料分類帳使用此數據來計算價格以評估這些物料。 物料臺賬是實際成本核算的基礎。它允許以多種貨幣對材料庫存進行評估&am…