再战设计模式之建造者模式
Posted bj-xiaodao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了再战设计模式之建造者模式相关的知识,希望对你有一定的参考价值。
建造者模式
他的本质主要是:
分离了组件的构造(由builder来负责),和装配(由Director负责),从而构造出复杂的对象,这个模式使用于:某个对象构建过程复杂的情况下使用
建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
由于实现了构建和装配的解耦。不同的构建器和不同的装配器 可以组合成很多不同的对象。也就是实现了构建算法、装配 算法的解耦,实现了更好的复用
场景:
在日常开发中,有时候我们需要一个复杂的对象.由于需求的原因.但是其中各部分的子对象经常变化,但是我们可以让他们组合起来相对简单稳定
使用场景. 1.我们需要很多零件 2.我们要把这些零件组装起来 当然在工作中,可能要和工厂模式搭配起来使用
代码:
这些实例可以使用简单工厂模式来生成不同的发动机 座椅啊.轮胎啊.
/** * 汽车 * @Created by xiaodao */ public class Car { private Seat seat; private Engine engine;//发动机 private Tyre tyre;//轮胎 public Car(Seat seat, Engine engine, Tyre tyre) { this.seat = seat; this.engine = engine; this.tyre = tyre; } public Seat getSeat() { return seat; } public void setSeat(Seat seat) { this.seat = seat; } public Engine getEngine() { return engine; } public void setEngine(Engine engine) { this.engine = engine; } public Tyre getTyre() { return tyre; } public void setTyre(Tyre tyre) { this.tyre = tyre; } } /** * @Created by xiaodao * 引擎实例 */ public class Engine { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Engine(String name) { this.name = name; } } /** * @Created by xiaodao * 座椅 */ public class Seat { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Seat(String name) { this.name = name; } } /** * @Created by xiaodao *轮胎 */ public class Tyre { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Tyre(String name) { this.name = name; } }
builder接口:
/** * @Created by xiaodao * 构建接口 这里也可以是抽象方法 */ public interface CarBuilder { /** * 构建引擎 * * @return */ Engine builderEngine(); Seat builderSeat(); Tyre builderTyre(); }
builder实现类:
/** * @Created by xiaodao */ public class AudiCarBuilderImpl implements CarBuilder { @Override public Engine builderEngine() { return new Engine("奥迪引擎"); } @Override public Seat builderSeat() { return new Seat("奥迪座椅"); } @Override public Tyre builderTyre() { return new Tyre("奥迪轮胎"); } }
direactor:用来引入builder类的引用.他不知道builder的子类是什么
/** * @Created by xiaodao */ public class CarDirector { private CarBuilder builder; public CarDirector(CarBuilder builder) { this.builder = builder; } /** * 装配汽车 * @return */ public Car directCar(){ Engine engine = builder.builderEngine(); Seat seat = builder.builderSeat(); Tyre tyre = builder.builderTyre(); return new Car(seat,engine,tyre); } }
调用者:
public class Client { public static void main(String[] args) { CarDirector carDirector = new CarDirector(new AudiCarBuilderImpl()); Car car = carDirector.directCar(); System.out.println(car.getEngine().getName()); System.out.println(car.getSeat().getName()); System.out.println(car.getTyre().getName()); } }
奥迪引擎
奥迪座椅
奥迪轮胎
类图:
登场角色
builder角色负责定义用户生成实例的接口
concreteBuilder(具体的builder) concreteBuilder角色是实现了Builder接口的类.定义了具体的方法
director(监工) 负责使用builder角色的接口来生成实例,他不依赖与Builder的子类 无论子类如何定义都不影响 director的使用
client 具体的调用者
这里我们可以把car 的各种属性变成工厂模式
总结:
建造者模式与抽象工厂模式相似.(director 和abstractFactory 的实现类)今天下午与同事讨论半天总是在这方面比较模糊.欢迎大家踊跃评论.
个人感觉工厂模式是用于创建什么样的对象
建造模式就用来怎么创建对象
工厂方法模式和建造者模式都属于对象创建类模式,都用来创建类的对象。但它们之间的区别还是比较明显的。
下面来自某位群友的讲解
● 意图不同
在工厂方法模式里,我们关注的是一个产品整体,如超人整体,无须关心产品的各部分是如何创建出来的;但在建造者模式中,一个具体产品的产生是依赖各个部件的产生以及装配顺序,它关注的是“由零件一步一步地组装出产品对象”。简单地说,工厂模式是一个对象创建的粗线条应用,建造者模式则是通过细线条勾勒出一个复杂对象,关注的是产品组成部分的创建过程。
● 产品的复杂度不同
工厂方法模式创建的产品一般都是单一性质产品,如成年超人,都是一个模样,而建造者模式创建的则是一个复合产品,它由各个部件复合而成,部件不同产品对象当然不同。这不是说工厂方法模式创建的对象简单,而是指它们的粒度大小不同。一般来说,工厂方法模式的对象粒度比较粗,建造者模式的产品对象粒度比较细。 两者的区别有了,那在具体的应用中,我们该如何选择呢?是用工厂方法模式来创建对象,还是用建造者模式来创建对象,这完全取决于我们在做系统设计时的意图,如果需要详细关注一个产品部件的生产、安装步骤,则选择建造者,否则选择工厂方法模式。
以上是关于再战设计模式之建造者模式的主要内容,如果未能解决你的问题,请参考以下文章