设计模式之建造者模式-----高上
来源:互联网 发布:淘宝几个好评一个心 编辑:程序博客网 时间:2024/06/06 14:13
Builder模式是一步一步创建一个复杂对象的创建者模型,客户可以在不知道内部构造的情况下,精准地控制对象的操作流程,此模式就是为了将一个复杂的对象和它的部件解耦,使得构建过程和部件的表示隔离开来。
它有如下几个使用场景:
(1)相同的方法,不同的执行顺序,产生不同的时间结果时。
(2)多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同时
(3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用也比较合适。
下面我们对这种模式中的几个角色进行一下介绍:
1.Builder
为创建一个Product对象的各个部件指定抽象接口。
2.ConcreteBuilder
实现Builder的接口以构造和装配该产品的各个部件。
定义并明确它所创建的表示。
提供一个检索产品的接口。
3.Director
构造一个使用Builder接口的对象。
4.Product
表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。
包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
下面我们来简单地用Java来实现一下:
我们先建一个计算机抽象类:
public abstract class Computer {//计算机的抽象类,就是代表product生产者public String board;public String display;public String os;public Computer() { super();}//设置cpu核心数public void setBoard(String board) { this.board = board;}//设置操作系统public void setDisplay(String display) { this.display = display;}public abstract void setos();@Overridepublic String toString() { return "Computer [board=" + board + ", display=" + display + ", os=" + os + "]";}
}
再来建一个计算机的实现类:
public class MYcomputer extends Computer {@Overridepublic void setos() { os="大苹果";}public MYcomputer() { // TODO Auto-generated constructor stub}
}
再来建一个Builder类:
<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">abstract</span> <span class="hljs-keyword">class</span> Builder { <span class="hljs-comment">//设置主机</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">abstract</span> <span class="hljs-keyword">void</span> <span class="hljs-title">buildBoard</span>(String board); <span class="hljs-comment">//设置显示器</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">abstract</span> <span class="hljs-keyword">void</span> <span class="hljs-title">buildDisplay</span>(String display); <span class="hljs-comment">//设置操作系统</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">abstract</span> <span class="hljs-keyword">void</span> <span class="hljs-title">buildos</span>(); <span class="hljs-comment">//创建Computer</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">abstract</span> Computer <span class="hljs-title">create</span>();}</code><ul class="pre-numbering"><li></li></ul>
再来建一个Builder的实现类:
<code class="hljs java has-numbering"><span class="hljs-comment">//具体的builder类</span><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MYcomputerbuilder</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Builder</span> {</span> <span class="hljs-keyword">private</span> Computer soncomputer=<span class="hljs-keyword">new</span> MYcomputer(); <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">buildBoard</span>(String board) { soncomputer.setBoard(board); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">buildDisplay</span>(String display) { soncomputer.setDisplay(display); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">buildos</span>() { soncomputer.setos(); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> Computer <span class="hljs-title">create</span>() { <span class="hljs-comment">// TODO Auto-generated method stub</span> <span class="hljs-keyword">return</span> soncomputer; }}</code><ul class="pre-numbering"><li></li></ul>
再来建一个Dirertor类负责去构造Computer:
<code class="hljs cs has-numbering"><span class="hljs-comment">//Dirertor 负责构造Computer</span><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> Dirertor { Builder mybuilder = <span class="hljs-keyword">null</span>; <span class="hljs-keyword">public</span> <span class="hljs-title">Dirertor</span>(Builder mybuilder) { super(); <span class="hljs-keyword">this</span>.mybuilder = mybuilder; } <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">construct</span>(String board,String display){ mybuilder.buildBoard(board); mybuilder.buildDisplay(display); mybuilder.buildos(); }}</code><ul class="pre-numbering"><li></li></ul>
最后我们来进行测试:
<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> Test { <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) { <span class="hljs-comment">//构造器</span> Builder sonbuild = <span class="hljs-keyword">new</span> MYcomputerbuilder(); Dirertor pcdirertor = <span class="hljs-keyword">new</span> Dirertor(sonbuild); <span class="hljs-comment">//封装构建过程</span> pcdirertor.construct(<span class="hljs-string">"高大上主板"</span>, <span class="hljs-string">"高大上显示器"</span>); <span class="hljs-comment">//构建计算机输出相关信息</span> System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"computer:"</span>+sonbuild.create().toString()); }}</code><ul class="pre-numbering"><li></li><li></li></ul>
输出结果是:
我们再来描述一下:上面我们通过MYcomputerbuilder来构建MYcomputer对象,Director则封装了构建这个对象的过程,对外隐藏了构建细节,Builder与Director共同将一个复杂对象的构建与表示分离,使得同样的构建过程可以构建不同的对象,好了先说这么多了,以后可以大家再深入讨论,,要去睡觉了。。。
- 设计模式之建造者模式-----高上
- 设计模式之建造者
- 设计模式 之 建造者
- 设计模式之建造者
- 设计模式之建造者模式
- 设计模式之建造者模式
- 五 设计模式之建造者模式
- 设计模式之建造者模式
- C# 设计模式之 建造者模式
- 【设计模式】之 Builder 建造者模式
- 设计模式之建造者模式学习
- 设计模式之建造者模式
- 设计模式笔记之---建造者模式
- 设计模式之建造者模式
- 设计模式之建造者模式
- 设计模式之建造者模式
- java设计模式之建造者模式
- 设计模式之建造者模式
- Talk about Jquery Touch
- 《MySql 必知必会》16-20
- MaterialDesign--SnackBar
- 使用IntelliJ IDEA 13搭建Android集成开发环境(图文教程)
- FloydWarshall 算法包含BellmanFord 和Dijkstra算法求单元最短路SSSP,可以有负权,有圈
- 设计模式之建造者模式-----高上
- Android 去除ActionBar:
- java 内存溢出
- Verilog 编程实验(5)-3-8线译码器的设计与实现
- oracle 查看用户下的所有表
- 浅析分形迷宫搜索解法
- [C++杂谈]:正则表达式的使用
- 设计模式这原型模式---高上
- 【NOIP模拟】打膈膜