设计模式 之 建造者

建造者模式(Builder Pattern)
    一听这个名字,你可能就会猜到一二分了。建造者简单理解就是造东西,仅仅只是建造者模式建造的不是一个简单的东西,是一个比較复杂的东西。就好像盖房子,须要打地基、砌墙、灌水泥、封顶,最后墙面贴瓷砖。
    建造者设计模式是一个构造复杂对象的设计模式。在一个软件系统中,可能会面临创建一个复杂对象的工作,假设我们使用单一的方法或者单一的对象来创建会比較烦琐,当所创建复杂对象发生改变时,整个系统就可能面临剧烈的变化。这时就须要我们将这个复杂对象的创建过程分解成若干部分,各个子部分用一定的算法构成。
    可是,子部分可能会常常发生改变,怎样能保证总体创建工作的稳定性呢?这就须要建造者模式的支持了。建造者模式把复杂对象的创建与表示分离,使得相同的构建过程能够创建不同的表示。




    前两天同学新买了一部HUAWEI P6-T00,智能手机就是智能,用流量用那叫一个快啊!,简直如行云流水一般,一会儿50M流量就不见了,真的让人怀疑手机开发商是不是和移动公司有什么猫腻。。。没办法,又不能不用手机,又不能不上网,最后仅仅能妥协,去营业厅更换套餐吧。以下就给大家讲讲动感地带上网套餐:


动感地带上网套餐?是什么样的上网套餐呢?上网套餐有N多种,怎样来表示这样的表现形式多样化的上网套餐?
    1.我们能够肯定的一点是终于的上网套餐是由哪几个部分组成的是确定的(业务名称、月消费、免费时长、流量和短信),也就是结构是知道的,可是套餐到底是什么样子的不知道


    2.下图是建造者模式实现上网套餐的静态类图。建造者模式将复杂对象的构造过程分解细化,使得每个部件完毕比較独立的工作(功能单一独立,高内聚),各个部件之间的关联不是非常紧密(松耦合);同一时候,又使得构件和表示相分离


           





using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Builder
{//套餐建造类abstract class MealBuilder{public abstract void BuildName();        //业务名称public abstract void BuildExpense();         //固定费用public abstract void BuildVoice();           //赠送语音public abstract void BuildFlow();            //赠送流量public abstract void BuildMessage();         //赠送短信}//详细套餐建造类(18)class Meal_18Builder : MealBuilder{public override void BuildName(){Console.WriteLine("动感地带上网套餐(18元)");}public override void BuildExpense(){Console.WriteLine("固定费用:18/月");}public override void BuildVoice(){Console.WriteLine("赠送语音:30分钟");}public override void BuildFlow(){Console.WriteLine("赠送流量:50M");}public override void BuildMessage(){Console.WriteLine("赠送短信:100条");}}//详细套餐建造类(28)class Meal_28Builder : MealBuilder{public override void BuildName(){Console.WriteLine("动感地带上网套餐(28元)");}public override void BuildExpense(){Console.WriteLine("固定费用:28/月");}public override void BuildVoice(){Console.WriteLine("赠送语音:50分钟");}public override void BuildFlow(){Console.WriteLine("赠送流量:100M");}public override void BuildMessage(){Console.WriteLine("赠送短信:150条");}}//详细套餐建造类(38)class Meal_38Builder : MealBuilder{public override void BuildName(){Console.WriteLine("动感地带上网套餐(38元)");}public override void BuildExpense(){Console.WriteLine("固定费用:38/月");}public override void BuildVoice(){Console.WriteLine("赠送语音:80分钟");}public override void BuildFlow(){Console.WriteLine("赠送流量:200M");}public override void BuildMessage(){Console.WriteLine("赠送短信:200条");}}//指挥者类class Director{private MealBuilder meal;public Director(MealBuilder meal){this.meal = meal;}public void CreateMeal(){meal.BuildName();meal.BuildExpense();meal.BuildVoice();meal.BuildFlow();meal.BuildMessage();}}class Program{static void Main(string[] args){MealBuilder meal_28builder = new Meal_28Builder();Director director_28 = new Director(meal_28builder);director_28.CreateMeal();Console.WriteLine();MealBuilder meal_38builder = new Meal_38Builder();Director director_38 = new Director(meal_38builder);director_38.CreateMeal();}}
}







                                      


    Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;还有一类方法是getResult(),它们用于返回复杂对象。Builder既能够是抽象类,也能够是接口。


    ConcreteBuilder(详细建造者):它实现了Builder接口,实现各个部件的详细构造和装配方法,定义并明白它所创建的复杂对象,也能够提供一个方法返回创建好的复杂产品对象。


    Product(产品角色):它是被构建的复杂对象,包括多个组成部件,详细建造者创建该产品的内部表示并定义它的装配过程。


    Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,能够在其construct()建造方法中调用建造者对象的部件构造与装配方法,完毕复杂对象的建造。client一般仅仅须要与指挥者进行交互,在client确定详细建造者的类型,并实例化详细建造者对象(也能够通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。


建造者模式的长处:
   
建造者将构建和表示分离,有效地将复杂对象处理过程分解,减少功能模块之间的耦合度,增强模块内部的内聚度,使得其在软件设计模式中具有极其重要的位置。


建造者模式的缺点:
   
1.建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,假设产品之间的差异性非常大,比如非常多组成部分都不同样,不适合使用建造者模式,因此其使用范围受到一定的限制。
    2.假设产品的内部变化复杂,可能会导致须要定义非常多详细建造者类来实现这样的变化,导致系统变得非常庞大,添加系统的理解难度和执行成本。


建造者与抽象工厂的差别:
   
抽象工厂和建造者有相似之处,它们都是创建复杂对象的设计模式,差别在于建造者着重于分步骤构造一个复杂对象,而抽象工厂则着重于多个系列的产品对象即对象族(简单的或复杂的)的构造。



使用场合
    1.当生成的产品对象内部具有复杂的结构时;
    2.当复杂对象须要与表示分离,可能须要创建不同的表示时;
    3.当须要向客户隐藏产品内部结构的表现时。













本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stl string 函数_使用C ++ STL中的string :: append()函数将文本追加到字符串

stl string 函数append() is a library function of <string> header, it is used to append the extra characters/text in the string. append()是<string>标头的库函数&#xff0c;用于在字符串中附加多余的字符/文本。 Syntax: 句法&#xff1a; string&…

ABCDE类IP地址的解释

A类地址第1字节为网络地址&#xff0c;其它3个字节为主机地址。另外第1个字节的最高位固定为0。 A类地址范围&#xff1a;1.0.0.0到127.255.255.255。 A类地址中的私有地址和保留地址&#xff1a; 10.0.0.0到10.255.255.255是私有地址&#xff08;所谓的私有地址就是在互联网上…

身体健康小窍门

身体健康对于每个人来说都是第一重要的&#xff0c;找到的一些健康小窍门&#xff0c;可能有帮助&#xff1a; 1&#xff09;单鼻呼吸&#xff08; 来源 &#xff09;&#xff1a;中午以前最好常练习用左鼻子呼吸&#xff0c;没事的时候你就用手很自然的托住右边面颊&#xf…

支付宝上市,让我损失了2000万(盘点这些年错过的机会)

选择大于努力&#xff01;这句话在之前&#xff0c;我只是用排除法来解释它&#xff08;如果你的选择是错的&#xff0c;那么走的越快就离目标越远&#xff09;&#xff0c;而如今几次亲身的经历&#xff0c;却给了我不同的答案...近几天支付宝上市的事儿&#xff0c;传的沸沸扬…

(转)深入理解最强桌面地图控件GMAP.NET --- 原理篇

前几篇介绍了一些国内地图的案例&#xff0c; 深入理解最强桌面地图控件GMAP.NET --- SOSO地图 深入理解最强桌面地图控件GMAP.NET --- 百度地图 我们以Google地图为例,这章介绍下地图加载的原理。 投影(Projection) 谷歌地图采用的是墨卡托投影法,这里转载&#xff08;http://…

运算符sizeof_C程序通过使用sizeof()运算符对数组元素进行计数

运算符sizeofsizeof() operator returns the total number of size occupied by a variable, since array is also a variable, we can get the occupied size of array elements. sizeof()运算符返回变量占用的大小总数&#xff0c;由于array也是变量&#xff0c;我们可以获取…

查看 端口占用情况

“开始”-->“运行”-->“cmd”打开命令提示符&#xff0c;&#xff08;或win R&#xff09;输入“netstat -ano”可以看到所有的连接。可能的话&#xff0c;在“windows任务管理器”找到PID对应的程序即可。如果没有PID项&#xff0c;可以在“windows任务管理器”选“查…

LeetCode刷题--- 字母大小写全排列

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回…

4种分布式Session的实现方式!老大直呼666...

前言公司有一个 Web 管理系统&#xff0c;使用 Tomcat 进行部署。由于是后台管理系统&#xff0c;所有的网页都需要登录授权之后才能进行相应的操作。起初这个系统的用的人也不多&#xff0c;为了节省资源&#xff0c;这个系统仅仅只是单机部署。后来随着用的人越来越多&#x…

丘处机《摄生消息论》(转)

来源&#xff1a;http://www.qiuchuji.org/?typeshowtopic&id11 遗憾的是没有找到好的翻译版本&#xff0c;并且文中好像有些错别字&#xff0c;没有原文也没法对照修改。 春季摄生消息 春三月&#xff0c;此谓发陈&#xff0c;天地俱生&#xff0c;万物以荣。夜臥早起&…

InputStreamReader 和 OutputStreamWriter类使用方法简单介绍,及演示。

InputStreamReader 和 OutputStreamWriter类使用方法简单介绍。 一、InputStreamReader类 InputStreamReader 将字节流转换为字符流。是字节流通向字符流的桥梁。假设不指定字符集编码&#xff0c;该解码过程将使用平台默认的字符编码&#xff0c;如&#xff1a;GBK。 构造方法…

回溯算法n皇后问题_使用回溯算法的N Queen问题和解决方案

回溯算法n皇后问题N-皇后问题 (N - Queens problem) The n – queen problem is the generalized problem of 8-queens or 4 – queen’s problem. Here, the n – queens are placed on a n * n chess board, which means that the chessboard has n rows and n columns and t…

天气预报HTML代码

天气预报HTML代码<iframe height"200" src"http://weather.news.qq.com/inc/ss218.htm" frameborder"0" width"200" scrolling"no"></iframe><iframe width"420" scrolling"no" height&…

PHP源码安装及配置——以fastCGI的方式与httpd整合

在前一篇博文中介绍了LAMP的安装及配置。这里专门介绍PHP以fastCGI的方式与httpd整合的情况下&#xff0c;具体如何编译及配置。而且假定httpd、mysql均如前一篇博文介绍的安装配置完毕。php也采取一样版本的源码包php-5.6.1.tar.bz2。1. 编译安装php# tar xf php-5.6.1.tar.b…

超简单的分布式ID生成方案!美团开源框架介绍

目录阐述背景Leaf snowflake 模式介绍Leaf segment 模式介绍Leaf 改造支持 RPC阐述背景不吹嘘&#xff0c;不夸张&#xff0c;项目中用到 ID 生成的场景确实挺多。比如业务要做幂等的时候&#xff0c;如果没有合适的业务字段去做唯一标识&#xff0c;那就需要单独生成一个唯一的…

高质量的c源代码

现在自由软件及开源软件越来越流行&#xff0c;有大量的附带源程序的软件可以使用&#xff0c;这给我们学习软件开发提供了更多方便。但另一方面&#xff0c;也使得找到高质量的软件越来越不易。Landon Curt Noll 推荐 阅读David Ingalls Bell 的源代码。fefe 网站很推崇D.J.Be…

Java LinkedList公共布尔提供(对象o)方法(带示例)

LinkedList公共布尔提供(对象o)方法 (LinkedList public boolean offer(Object o) method) This method is available in package java.util.LinkedList.offer(Object o). 软件包java.util.LinkedList.offer(Object o)中提供了此方法。 This method is used to adds a specifie…

教你写Bug,常见的 OOM 异常分析

在《Java虚拟机规范》的规定里&#xff0c;除了程序计数器外&#xff0c;虚拟机内存的其他几个运行时区域都有发生 OutOfMemoryError 异常的可能。本篇主要包括如下 OOM 的介绍和示例&#xff1a;java.lang.StackOverflowErrorjava.lang.OutOfMemoryError: Java heap spacejava…

elf文件格式实例解析

试验环境&#xff1a;archlinux 速龙3000&#xff08;即x86兼容32位处理器&#xff09; 必须软件&#xff1a;gcc binutils 参考资料&#xff1a; System V application binary interface ELF Format &#xff08;mirror txt format ) Hello,world in less than 20 bytes…

离散数学关系的性质_关系和关系的性质| 离散数学

离散数学关系的性质笛卡尔积(A * B不等于B * A) (Cartesian product (A*B not equal to B*A)) Cartesian product denoted by * is a binary operator which is usually applied between sets. It is a set of ordered pairs where the first member of the pair belongs to th…