本文实例讲述了c#设计模式之builder生成器模式解决带老婆配置电脑问题。分享给大家供大家参考,具体如下:
一、理论定义
生成器模式 又叫:建造者模式,它 可以 把一个 复杂的对象,分步骤创建。
二、应用举例
需求描述:话说发工资了,打算去岗顶百脑汇 给老婆配置一台电脑。
ok,坐着brt,就出发了。
到岗顶,一美女扑面而来,面带微笑:先生,请问看中那个品牌,过来看一下嘛!
人家都开口了,盛情难却,就看下吧。
三、具体编码
1.cpu
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { /// <summary> /// cpu /// </summary> public class cpu { /// <summary> /// cpu品牌 /// </summary> public string brand { get; set; } /// <summary> /// cpu系列名 /// </summary> public string serialsname { get; set; } //其他属性........... } }
2.主板
主板motherboard
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { /// <summary> /// 主板 /// </summary> public class motherboard { /// <summary> /// 主板品牌 /// </summary> public string brand { get; set; } /// <summary> /// 主板系列名 /// </summary> public string serialsname { get; set; } //其他属性........... } }
3.内存条
内存条memory
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { /// <summary> /// memory /// </summary> public class memory { /// <summary> /// memory品牌 /// </summary> public string brand { get; set; } /// <summary> /// memory系列名 /// </summary> public string serialsname { get; set; } //其他属性........... } }
4.硬盘
硬盘harddisk
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { /// <summary> /// harddisk /// </summary> public class harddisk { /// <summary> /// harddisk品牌 /// </summary> public string brand { get; set; } /// <summary> /// harddisk系列名 /// </summary> public string serialsname { get; set; } //其他属性........... } }
5.显卡
显卡graphiccard
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { /// <summary> ///显卡 graphiccard /// </summary> public class graphiccard { /// <summary> /// 显卡graphiccard品牌 /// </summary> public string brand { get; set; } /// <summary> /// 显卡graphiccard系列名 /// </summary> public string serialsname { get; set; } //其他属性........... } }
6.显示器
显示器display
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { /// <summary> /// display /// </summary> public class display { /// <summary> /// 显示器品牌 /// </summary> public string brand { get; set; } /// <summary> /// 系列名 /// </summary> public string serialsname { get; set; } //其他属性........... } }
7.音箱
音箱speakers
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { /// <summary> /// 音箱speakers /// </summary> public class speakers { /// <summary> /// speakers品牌 /// </summary> public string brand { get; set; } /// <summary> /// speakers系列名 /// </summary> public string serialsname { get; set; } //其他属性........... } }
8.键盘
键盘keyboard
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { /// <summary> /// 键盘keyboard /// </summary> public class keyboard { /// <summary> /// keyboard品牌 /// </summary> public string brand { get; set; } /// <summary> /// 键盘keyboard系列名 /// </summary> public string serialsname { get; set; } //其他属性........... } }
9.鼠标
鼠标mouse
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { /// <summary> /// 鼠标mouse /// </summary> public class mouse { /// <summary> /// mouse品牌 /// </summary> public string brand { get; set; } /// <summary> /// 鼠标mouse系列名 /// </summary> public string serialsname { get; set; } //其他属性........... } }
10.电脑配置单config
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { public class config { /// <summary> /// cpu /// </summary> public cpu cpu { get; set; } /// <summary> /// 显示器 /// </summary> public display display { get; set; } /// <summary> /// 主板 /// </summary> public motherboard motherboard { get; set; } /// <summary> /// 内存条 /// </summary> public memory memory { get; set; } /// <summary> /// 硬盘 /// </summary> public harddisk harddisk { get; set; } /// <summary> /// 显卡 /// </summary> public graphiccard graphiccard { get; set; } /// <summary> /// 音箱 /// </summary> public speakers speakers { get; set; } /// <summary> /// 键盘 /// </summary> public keyboard keyboard { get; set; } /// <summary> /// 鼠标 /// </summary> public mouse mouse { get; set; } } }
11.一台电脑computer
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { /// <summary> /// 电脑 /// </summary> public class computer { /// <summary> /// cpu /// </summary> public cpu cpu { get; set; } /// <summary> /// 显示器 /// </summary> public display display { get; set; } /// <summary> /// 主板 /// </summary> public motherboard motherboard { get; set; } /// <summary> /// 内存条 /// </summary> public memory memory { get; set; } /// <summary> /// 硬盘 /// </summary> public harddisk harddisk { get; set; } /// <summary> /// 显卡 /// </summary> public graphiccard graphiccard { get; set; } /// <summary> /// 音箱 /// </summary> public speakers speakers { get; set; } /// <summary> /// 键盘 /// </summary> public keyboard keyboard { get; set; } /// <summary> /// 鼠标 /// </summary> public mouse mouse { get; set; } /// <summary> /// 电脑品牌厂商 /// </summary> public manufactures manufactures { get; set; } /// <summary> /// 属于的系列 /// </summary> public string serials{ get; set; } /// <summary> /// 显示电脑配置 /// </summary> public void showconfig() { console.writeline(manufactures +"\t"+ serials+" 系列的配置如下:"); console.writeline("--------------------------------------------------"); console.writeline("配件 品牌\t 系列"); console.writeline("cpu " + cpu.brand + "\t " + cpu.serialsname + "系列"); console.writeline("主板 " + motherboard.brand + "\t " + motherboard.serialsname + "系列"); console.writeline("内存条 " + memory.brand + "\t " + memory.serialsname + "系列"); console.writeline("硬盘 " + harddisk.brand + "\t " + harddisk.serialsname + "系列"); console.writeline("显卡 " + graphiccard.brand + "\t " + graphiccard.serialsname + "系列"); console.writeline("显示器 " + display.brand + "\t " + display.serialsname + "系列"); console.writeline("音箱 " + speakers.brand + "\t " + speakers.serialsname + "系列"); console.writeline("键盘 " + keyboard.brand + "\t " + keyboard.serialsname + "系列"); console.writeline("鼠标 " + mouse.brand + "\t " + mouse.serialsname + "系列"); console.writeline(); console.writeline(); } } }
12.某一品牌 某一系列 产品的 具体配置
using system; using system.collections.generic; using system.linq; using system.text; using com.design.gof.builder.factory; namespace com.design.gof.builder { /// <summary> /// 某一个产品的配置 /// </summary> public class serialsmodel { private config cfg = null; /// <summary> /// 获取电脑配置单 /// </summary> /// <param name="manufactures"></param> /// <param name="serialsname"></param> public serialsmodel(manufactures manufactures, string serialsname) { cfg= configfactory.getconfig(manufactures, serialsname); } /// <summary> /// 具体配置,每个产品系列都有对应的产品配置单 /// </summary> public config cfg { get { return cfg; } } } }
13.电脑配置单,读取的是xml文件,一共有三个测试文件,联想thinkpad.xml,三星.xml,索尼.xml,下面只显示联想,其他的随附件下载
<?xml version="1.0" encoding="utf-8" ?> <products> <product brand="lenovo" serials="联想ideacentre k330"> <config> <cpu brand="intel">intel 酷睿 i5 2320 </cpu> <motherboard brand="华硕">华硕 h61系列</motherboard> <memory brand="金士顿">金士顿 xxxx</memory> <harddisk brand="希捷">希捷1tb 7200转,sata2</harddisk> <graphiccard brand="华硕">华硕显卡xxxx</graphiccard> <display brand="lenovo">联想显示器xxxx</display> <speakers brand="lenovo">联想xxxx</speakers> <keyboard brand="lenovo">联想键盘xxxx</keyboard> <mouse brand="微软">微软鼠标xxxx</mouse> </config> </product> <product brand="thinkpad" serials="联想y670p-ifi"> <config> <cpu brand="intel">intel 酷睿i5 2450m </cpu> <motherboard brand="华硕">华硕 h61系列</motherboard> <memory brand="金士顿">金士顿 xxxx</memory> <harddisk brand="希捷">希捷500g xxxx</harddisk> <graphiccard brand="华硕">华硕显卡xxxx</graphiccard> <display brand="lg">lg显示器xxxx</display> <speakers brand="漫步者">漫步者xxxx</speakers> <keyboard brand="微软">微软键盘xxxx</keyboard> <mouse brand="罗技">罗技鼠标xxxx</mouse> </config> </product> <product brand="thinkpad" serials="联想b470p-ifi"> <config> <cpu brand="intel">intel 酷睿i5 2450m </cpu> <motherboard brand="华硕">华硕 h61系列</motherboard> <memory brand="金士顿">金士顿 xxxx</memory> <harddisk brand="希捷">希捷500g xxxx</harddisk> <graphiccard brand="华硕">华硕显卡xxxx</graphiccard> <display brand="lg">lg显示器xxxx</display> <speakers brand="漫步者">漫步者xxxx</speakers> <keyboard brand="微软">微软键盘xxxx</keyboard> <mouse brand="长城">长城鼠标xxxx</mouse> </config> </product> </products>
14.一个专门负责获取电脑 配置单的 简单工具类
using system; using system.collections.generic; using system.linq; using system.xml.linq; using system.xml.xpath; using system.text; using com.design.gof.builder; using system.xml; using system.io; namespace com.design.gof.builder.factory { public class configfactory { /// <summary> /// 获取电脑配置单 /// </summary> /// <param name="manufactures">电脑厂商</param> /// <param name="serialname">指定系列</param> /// <returns></returns> public static config getconfig(manufactures manufactures, string serialname) { config cfg = new config(); //从xml文件,加载电脑配置单 xdocument doc = xdocument.parse(file.readalltext(appdomain.currentdomain.basedirectory + @"\builder\data\" + manufactures + ".xml")); xpathnavigator nav=doc.createnavigator(); xpathnavigator n=nav.selectsinglenode("/products/product[@serials='" + serialname.trim() + "']"); n.movetochild("config",""); if (n == null) { return cfg; } string brand = string.empty, serials = string.empty; //cpu n.movetochild("cpu", ""); brand = n.getattribute("brand", ""); serials = n.value; cfg.cpu = new cpu { brand = brand, serialsname = serials }; //主板motherboard n.movetonext("motherboard",""); brand = n.getattribute("brand", ""); serials = n.value; cfg.motherboard = new motherboard { brand = brand, serialsname = serials }; //内存memory n.movetonext("memory", ""); brand = n.getattribute("brand", ""); serials = n.value; cfg.memory = new memory { brand = brand, serialsname = serials }; //硬盘harddisk n.movetonext("harddisk", ""); brand = n.getattribute("brand", ""); serials = n.value; cfg.harddisk = new harddisk { brand = brand, serialsname = serials }; //显卡graphiccard n.movetonext("graphiccard", ""); brand = n.getattribute("brand", ""); serials = n.value; cfg.graphiccard = new graphiccard { brand = brand, serialsname = serials }; //显示器display n.movetonext("display", ""); brand = n.getattribute("brand", ""); serials = n.value; cfg.display = new display { brand = brand, serialsname = serials }; //音箱speakers n.movetonext("motherboard", ""); brand = n.getattribute("brand", ""); serials = n.value; cfg.speakers = new speakers { brand = brand, serialsname = serials }; //键盘keyboard n.movetonext("keyboard", ""); brand = n.getattribute("brand", ""); serials = n.value; cfg.keyboard = new keyboard { brand = brand, serialsname = serials }; //鼠标motherboard n.movetonext("mouse", ""); brand = n.getattribute("brand", ""); serials = n.value; cfg.mouse = new mouse { brand = brand, serialsname = serials }; return cfg; } } }
15.一个接口,定义了如何构建一个电脑
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { public interface ibuilder { /// <summary> /// cpu /// </summary> void buildercpu(cpu cpu); /// <summary> /// 主板 /// </summary> void buildermotherboard(motherboard motherboard); /// <summary> /// 显示器 /// </summary> void builderdisplay(display display); /// <summary> /// 内存条 /// </summary> void buildermemory(memory memory); /// <summary> /// 硬盘 /// </summary> void builderharddisk(harddisk harddisk); /// <summary> /// 显卡 /// </summary> void buildergraphiccard(graphiccard graphiccard); /// <summary> /// 音箱 /// </summary> void builderspeakers(speakers speakers); /// <summary> /// 键盘 /// </summary> void builderkeyboard(keyboard keyboard); /// <summary> /// 鼠标 /// </summary> void buildermouse(mouse mouse); /// <summary> /// 获取组装好的电脑 /// </summary> /// <returns></returns> computer getcomputer(); } }
16.联想电脑
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { /// <summary> /// thinkpad品牌厂商 /// </summary> public class thinkpad:ibuilder { computer computer = null;//电脑 serialsmodel serials = null;//某个产品系列的具体产品 public thinkpad(manufactures manufactures, string serialsname) { computer = new computer { manufactures = manufactures, serials = serialsname }; serials = new serialsmodel(manufactures, serialsname); } #region 装配电脑 /// <summary> /// 1.组装 cpu /// </summary> /// <param name="cpu"></param> public void buildercpu(cpu cpu) { computer.cpu = cpu; } /// <summary> /// 2.组装 主板 /// </summary> /// <param name="motherboard"></param> public void buildermotherboard(motherboard motherboard) { computer.motherboard = motherboard; } /// <summary> /// 3.组装 内存条 /// </summary> /// <param name="display"></param> public void buildermemory(memory memory) { computer.memory = memory; } /// <summary> ///4.组装 硬盘 /// </summary> /// <param name="display"></param> public void builderharddisk(harddisk harddisk) { computer.harddisk = harddisk; } /// <summary> /// 5.组装 显卡 /// </summary> /// <param name="display"></param> public void buildergraphiccard(graphiccard graphiccard) { computer.graphiccard = graphiccard; } /// <summary> /// 6.组装 显示器 /// </summary> /// <param name="display"></param> public void builderdisplay(display display) { computer.display = display; } /// <summary> /// 7.组装 音箱 /// </summary> /// <param name="display"></param> public void builderspeakers(speakers speakers) { computer.speakers = speakers; } /// <summary> /// 8.组装 键盘 /// </summary> /// <param name="display"></param> public void builderkeyboard(keyboard keyboard) { computer.keyboard = keyboard; } /// <summary> /// 9.组装 鼠标 /// </summary> /// <param name="display"></param> public void buildermouse(mouse mouse) { computer.mouse = mouse; } #endregion /// <summary> /// 获取组装后的电脑 /// </summary> /// <returns></returns> public computer getcomputer() { //步骤1--cpu buildercpu(serials.cfg.cpu); //步骤2---主板 buildermotherboard(serials.cfg.motherboard); //步骤3--内存条 buildermemory(serials.cfg.memory); //步骤4--硬盘 builderharddisk(serials.cfg.harddisk); //步骤5--显卡 buildergraphiccard(serials.cfg.graphiccard); //步骤6--显示器 builderdisplay(serials.cfg.display); //步骤7--音箱 builderspeakers(serials.cfg.speakers); //步骤8--键盘 builderkeyboard(serials.cfg.keyboard); //步骤9--鼠标 buildermouse(serials.cfg.mouse); return computer; } } }
17.索尼电脑
sony
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { /// <summary> /// sony索尼品牌厂商 /// </summary> public class sony:ibuilder { computer computer = null;//电脑 serialsmodel serials = null;//某个产品系列的具体产品 public sony(manufactures manufactures, string serialsname) { computer = new computer { manufactures = manufactures, serials = serialsname }; serials = new serialsmodel(manufactures, serialsname); } #region 装配电脑 /// <summary> /// 1.组装 cpu /// </summary> /// <param name="cpu"></param> public void buildercpu(cpu cpu) { computer.cpu = cpu; } /// <summary> /// 2.组装 主板 /// </summary> /// <param name="motherboard"></param> public void buildermotherboard(motherboard motherboard) { computer.motherboard = motherboard; } /// <summary> /// 3.组装 内存条 /// </summary> /// <param name="display"></param> public void buildermemory(memory memory) { computer.memory = memory; } /// <summary> ///4.组装 硬盘 /// </summary> /// <param name="display"></param> public void builderharddisk(harddisk harddisk) { computer.harddisk = harddisk; } /// <summary> /// 5.组装 显卡 /// </summary> /// <param name="display"></param> public void buildergraphiccard(graphiccard graphiccard) { computer.graphiccard = graphiccard; } /// <summary> /// 6.组装 显示器 /// </summary> /// <param name="display"></param> public void builderdisplay(display display) { computer.display = display; } /// <summary> /// 7.组装 音箱 /// </summary> /// <param name="display"></param> public void builderspeakers(speakers speakers) { computer.speakers = speakers; } /// <summary> /// 8.组装 键盘 /// </summary> /// <param name="display"></param> public void builderkeyboard(keyboard keyboard) { computer.keyboard = keyboard; } /// <summary> /// 9.组装 鼠标 /// </summary> /// <param name="display"></param> public void buildermouse(mouse mouse) { computer.mouse = mouse; } #endregion /// <summary> /// 获取组装后的电脑 /// </summary> /// <returns></returns> public computer getcomputer() { //步骤1--cpu buildercpu(serials.cfg.cpu); //步骤2---主板 buildermotherboard(serials.cfg.motherboard); //步骤3--内存条 buildermemory(serials.cfg.memory); //步骤4--硬盘 builderharddisk(serials.cfg.harddisk); //步骤5--显卡 buildergraphiccard(serials.cfg.graphiccard); //步骤6--显示器 builderdisplay(serials.cfg.display); //步骤7--音箱 builderspeakers(serials.cfg.speakers); //步骤8--键盘 builderkeyboard(serials.cfg.keyboard); //步骤9--鼠标 buildermouse(serials.cfg.mouse); return computer; } } }
18.三星电脑
三星
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { /// <summary> /// samsung索尼品牌厂商 /// </summary> public class samsung:ibuilder { computer computer = null;//电脑 serialsmodel serials = null;//某个产品系列的具体产品 public samsung(manufactures manufactures, string serialsname) { computer = new computer { manufactures = manufactures, serials = serialsname }; serials = new serialsmodel(manufactures, serialsname); } #region 装配电脑 /// <summary> /// 1.组装 cpu /// </summary> /// <param name="cpu"></param> public void buildercpu(cpu cpu) { computer.cpu = cpu; } /// <summary> /// 2.组装 主板 /// </summary> /// <param name="motherboard"></param> public void buildermotherboard(motherboard motherboard) { computer.motherboard = motherboard; } /// <summary> /// 3.组装 内存条 /// </summary> /// <param name="display"></param> public void buildermemory(memory memory) { computer.memory = memory; } /// <summary> ///4.组装 硬盘 /// </summary> /// <param name="display"></param> public void builderharddisk(harddisk harddisk) { computer.harddisk = harddisk; } /// <summary> /// 5.组装 显卡 /// </summary> /// <param name="display"></param> public void buildergraphiccard(graphiccard graphiccard) { computer.graphiccard = graphiccard; } /// <summary> /// 6.组装 显示器 /// </summary> /// <param name="display"></param> public void builderdisplay(display display) { computer.display = display; } /// <summary> /// 7.组装 音箱 /// </summary> /// <param name="display"></param> public void builderspeakers(speakers speakers) { computer.speakers = speakers; } /// <summary> /// 8.组装 键盘 /// </summary> /// <param name="display"></param> public void builderkeyboard(keyboard keyboard) { computer.keyboard = keyboard; } /// <summary> /// 9.组装 鼠标 /// </summary> /// <param name="display"></param> public void buildermouse(mouse mouse) { computer.mouse = mouse; } #endregion /// <summary> /// 获取组装后的电脑 /// </summary> /// <returns></returns> public computer getcomputer() { //步骤1--cpu buildercpu(serials.cfg.cpu); //步骤2---主板 buildermotherboard(serials.cfg.motherboard); //步骤3--内存条 buildermemory(serials.cfg.memory); //步骤4--硬盘 builderharddisk(serials.cfg.harddisk); //步骤5--显卡 buildergraphiccard(serials.cfg.graphiccard); //步骤6--显示器 builderdisplay(serials.cfg.display); //步骤7--音箱 builderspeakers(serials.cfg.speakers); //步骤8--键盘 builderkeyboard(serials.cfg.keyboard); //步骤9--鼠标 buildermouse(serials.cfg.mouse); return computer; } } }
19.美女销售员,指导我们买电脑
using system; using system.collections.generic; using system.linq; using system.text; namespace com.design.gof.builder { /// <summary> /// 电脑厂家,销售员指导 消费者 要购买那个 品牌 的电脑 /// </summary> public enum manufactures { acer宏碁=1, alienware=2,长城=3, 戴尔=4, 东芝=5, 典籍=6, 多彩=7, dcmofa=8,eser宇朔=9,富士通=10, 方正=11,gateway华硕=12, 惠普=13, 海尔=14, 瀚斯宝丽=15,intel=16, 技嘉=17,联想=18, 联想thinkpad=19, 雷蛇=20, lg=21, 镭波=22, msi微星=23, 明唐=24,nec=25, 苹果=26,清华=27,同方=28, 七喜=29, 七彩虹=30,神舟=31, 索尼=32, 三星=33, 松下=34, 史密斯=35, 索泰=36, 神酷=37, terransforce=38,微软=39, 万利达=40, 新蓝=41,优派=42 } public class salesman { /// <summary> /// 电脑配置 /// </summary> public void showconfig() { builder.getcomputer().showconfig(); } /// <summary> /// 制造商 /// </summary> public ibuilder builder { get; set; } } }
20.主函数调用
using system; using system.collections.generic; using system.linq; using system.text; using com.design.gof.builder; namespace com.design.gof.test { class program { static void main(string[] args) { //这位先生,请问你看中哪个型号?这边来看下吧! salesman salesman = new salesman(); //美女介绍的 第一台电脑 salesman.builder = new thinkpad(manufactures.联想thinkpad, "联想ideacentre k330"); salesman.showconfig(); //电脑配置 //第二台电脑 salesman.builder = new sony(manufactures.索尼, "索尼e14a17ecw"); salesman.showconfig(); //电脑配置 //第三台电脑 salesman.builder = new samsung(manufactures.三星, "三星300e4a-s0g"); salesman.showconfig(); //电脑配置 console.readkey(); } } }
21.运行结果
22.总结
本来想把每个电脑配件再细化,发现工程很大,电脑 产品的属性很多,所以只列出2个字段。
附件里面包括了程序源码。也包括其他项目的测试,有控制台,有web。
附:完整实例代码点击此处。
更多关于c#相关内容还可查看本站专题:《c#数据结构与算法教程》、《c#窗体操作技巧汇总》、《c#常见控件用法教程》、《winform控件用法总结》、《c#数组操作技巧总结》及《c#面向对象程序设计入门教程》
希望本文所述对大家c#程序设计有所帮助。
如对本文有疑问, 点击进行留言回复!!
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
C#实现获取本地内网(局域网)和外网(公网)IP地址的方法分析
网友评论