创造型模式 - 建造者模式
来源:互联网 发布:淘宝退款什么时候到账 编辑:程序博客网 时间:2024/04/29 23:31
个人理解:
一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式(Builder Pattern)也叫做生成器模式,其定义如下:
Separate the construction of a complex object from its representation so that the same construction process can create different representations. 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
四个要素
产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
建造者模式的应用场景
1.创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。
2.要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。
结构图
1、封装性 使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、建造者独立,容易扩展,对系统的扩展非常有利。
3、便于控制细节风险。由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
建造者模式的应用实例
注意:
建造者模式和工厂模式非常相似,但是:建造者模式最主要功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了,通俗的说就是零件的装配,顺序不同产生的对象也不同。组装顺序不同对象效能也不同,这才是建造者模式要表达的核心意义,而怎么才能更好的达到这种效果呢?引入模板方法模式是一个非常简单而有效的办法。;而工厂方法则重点是创建,创建零件时它的主要职责,你要什么对象我创造一个对象出来,组装顺序则不是他关心的。
代码(其实读UML图要比代码还要一目了然)
我觉得这个例子还是有代表性的,因为它满足了:"构建过程可以创建不同的表示"。
另一个例子:
一个典型的复杂类对象代码示例如下:
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
补充模式:空对象模式
参考/转自
http://www.oodesign.com/builder-pattern.html
http://sourcemaking.com/design_patterns/builder
http://sourcemaking.com/design_patterns/builder/java/2
http://sourcemaking.com/design_patterns/builder/java/1
http://blog.csdn.net/hello_haozi/article/details/38819935
http://www.cnblogs.com/cbf4life/archive/2010/01/14/1647710.html
http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/19/2599980.html
http://blog.csdn.net/ljianhui/article/details/8280594
一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
在搜索了众多的建造者模式后,我发现,有的给出的建造者目的是为了封装产品不同的顺序,有的是同样的顺序不同的产品,有的顺序是封装在Director中,有的都不封装,而是延迟到Client中再定。其实它们都是可以的,因为:"创建者将一个复杂对象的构建与它的表示分离"。
但是,既然建造者主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。那么建造者中的一个非常重要的类就是指挥者(Director)类,它用来控制建造过程,也用它来隔离用户与建造过程的关联。所以,应该将顺序的变化或产生的不同的产品都应该在Director中办喽。
模式类型:
builder 建造者模式 - 创建型模式
建造者模式(Builder Pattern)也叫做生成器模式,其定义如下:
Separate the construction of a complex object from its representation so that the same construction process can create different representations. 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
四个要素
产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
建造者模式的应用场景
1.创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。
2.要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。
结构图
1、封装性 使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、建造者独立,容易扩展,对系统的扩展非常有利。
3、便于控制细节风险。由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
建造者模式的应用实例
注意:
建造者模式和工厂模式非常相似,但是:建造者模式最主要功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了,通俗的说就是零件的装配,顺序不同产生的对象也不同。组装顺序不同对象效能也不同,这才是建造者模式要表达的核心意义,而怎么才能更好的达到这种效果呢?引入模板方法模式是一个非常简单而有效的办法。;而工厂方法则重点是创建,创建零件时它的主要职责,你要什么对象我创造一个对象出来,组装顺序则不是他关心的。
代码(其实读UML图要比代码还要一目了然)
我觉得这个例子还是有代表性的,因为它满足了:"构建过程可以创建不同的表示"。
/* "Product" */class Pizza { private String dough = ""; private String sauce = ""; private String topping = ""; public void setDough(String dough) { this.dough = dough; } public void setSauce(String sauce) { this.sauce = sauce; } public void setTopping(String topping) { this.topping = topping; }}/* "Abstract Builder" */abstract class PizzaBuilder { protected Pizza pizza; public Pizza getPizza() { return pizza; } public void createNewPizzaProduct() { pizza = new Pizza(); } public abstract void buildDough(); public abstract void buildSauce(); public abstract void buildTopping();}/* "ConcreteBuilder" */class HawaiianPizzaBuilder extends PizzaBuilder { public void buildDough() { pizza.setDough("cross"); } public void buildSauce() { pizza.setSauce("mild"); } public void buildTopping() { pizza.setTopping("ham+pineapple"); }}/* "ConcreteBuilder" */class SpicyPizzaBuilder extends PizzaBuilder { public void buildDough() { pizza.setDough("pan baked"); } public void buildSauce() { pizza.setSauce("hot"); } public void buildTopping() { pizza.setTopping("pepperoni+salami"); }}/* "Director" */class Waiter { private PizzaBuilder pizzaBuilder; public void setPizzaBuilder(PizzaBuilder pb) { pizzaBuilder = pb; } public Pizza getPizza() { return pizzaBuilder.getPizza(); } public void constructPizza() { pizzaBuilder.createNewPizzaProduct(); pizzaBuilder.buildDough(); pizzaBuilder.buildSauce(); pizzaBuilder.buildTopping(); }}/* A customer ordering a pizza. */class BuilderExample { public static void main(String[] args) { Waiter waiter = new Waiter(); PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder(); PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder(); waiter.setPizzaBuilder( hawaiian_pizzabuilder ); waiter.constructPizza(); Pizza pizza = waiter.getPizza(); }}
另一个例子:
一个典型的复杂类对象代码示例如下:
class Productor { private Part partA; private Part partB; private Part partC; // 这些是各个部件的set和get的方法,在此省略。。。 } //这是抽象的Builder: abstract class Builder { public abstract void buildPartA(); public abstract void buildPartB(); public abstract void buildPartC(); } //继承Builder的具体的建造者: class ConcreteBuilder extends Builder { private Product product; // 创建partA public void buildPartA() { // 在此创建出部件 Part partA = new PartA(); // ...... // 把partA传递给product product.setPartA(partA); } // 创建partB public void buildPartB() { // 在此创建出部件 Part partB = new PartB(); // ...... // 把partB传递给product product.setPartA(partB); } // 创建partC public void buildPartC() { // 在此创建出部件 Part partC = new PartC(); // ...... // 把partC传递给product product.setPartA(partC); } // 返回复杂产品对象 public void getProduct() { return this.product; } } //这是导演,负责流程规范,在导演类中可以注入建造者对象。 class Director { private Builder concretebuilder; // 构造方法中也可以传递builder public Director(Builder builder) { this.concretebuilder = builder; } // 传递builder public void setBuilder(Builder builder) { this.concretebuilder = builder; } // 这个方法用来规范流程,产品构建和组装方法 public void construct() { builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); } } // 客户端使用: class Main { public static void main(String[] args) { // 对于客户端而言,只需要关心具体的建造者,无需关心产品内部构建流程。我如果需要其他的复杂产品对象,只需要选择其他的建造者,如果需要扩展,则只需要写一个新的builder就行。如果可以,这个建造者甚至可以用配置文件做,增加更多的扩展性。 Builder builder = new ConcreteBuilder(); // 把建造者注入导演 Director director = new Director(builder); // 指挥者负责流程把控 director.construct(); // 建造者返回一个组合好的复杂产品对象 Productor productor = builder.getProductor(); } }
所有模式
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
补充模式:空对象模式
参考/转自
http://www.oodesign.com/builder-pattern.html
http://sourcemaking.com/design_patterns/builder
http://sourcemaking.com/design_patterns/builder/java/2
http://sourcemaking.com/design_patterns/builder/java/1
http://blog.csdn.net/hello_haozi/article/details/38819935
http://www.cnblogs.com/cbf4life/archive/2010/01/14/1647710.html
http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/19/2599980.html
http://blog.csdn.net/ljianhui/article/details/8280594
转载请注明:http://blog.csdn.net/paincupid/article/details/43865915
0 0
- 创造型模式 - 建造者模式
- 建造型——建造者模式
- 设计模式之建造型-建造者模式(4)
- 创建型模式-建造者
- 创建型模式-建造者
- 建造者模式(创建型)
- (创建型模式)Builder 建造者模式
- 创建型模式之建造者模式
- 四:创建型模式:建造者模式
- 创建型模式-Builder ( 建造者模式 )
- 创建型模式-建造者模式
- 创建型模式之建造者模式
- 创建型模式 --- 建造者模式(Builder)
- 创建型模式之建造者模式
- 创建型设计模式-建造者模式
- 创建型模式之建造者模式
- 创建型模式—建造者模式
- 设计模式:建造者模式
- 四家股份制银行业绩快报亮相 难掩业绩增速放缓
- 11a 模态对话方框
- 6 ①shape 文本框风格 ②按钮式的shape 弧形shape
- 【poj 1741】点分治
- Design Patterns : Protect Proxy
- 创造型模式 - 建造者模式
- HDU 1181 变形课
- 【JavaScript】原生态兼容IE6的图片轮播
- 6 clip 慢慢展开的图片
- HDU 1023 Train Problem II
- vector 实现邻接表
- java-职责链模式
- 【Python学习记录】2015-02-17
- NYOJ--36(动态规划)-题目----------------------------- 最长公共子序列