建造者模式
2018-07-26 本文已影响8人
T_log
建造者模式
- 概述
- 建造者模式(Builder pattern),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的标识
- 建造者模式是一步一步的创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
- 建造者模式属于对象创建型模式,又称为生成器模式
- 建造者模式的角色
- Builder:抽象建造者,用于构建角色的抽象方法
- ConcreateBuilder:具体构建者,在创建具体角色对象时,使用该角色进行创建
- Director:指挥者,用于根据不同的参数创建不同的产品角色对象
- Product:产品角色,具体的创建的对象
- demo
产品角色
/**
* @author : jzb219@gmial.com
* @description : 产品角色
* @date : 2018/7/26 上午9:46
*/
public class Role {
private String head;
private String face;
private String body;
private Double hp;
private Double sp;
private Double mp;
//省略getter、setter、toString
}
抽象建造者
/**
* @author : jzb219@gmial.com
* @description : 抽象建造者
* @date : 2018/7/26 上午10:12
*/
public abstract class Builder {
protected Role role = new Role();
public abstract void buildHead();
public abstract void buildFace();
public abstract void buildBody();
public abstract void buildHp();
public abstract void buildSp();
public abstract void buildMp();
public Role getResult() {
return role;
}
}
具体建造者
/**
* @author : jzb219@gmial.com
* @description : 具体建造者
* @date : 2018/7/26 上午10:25
*/
public class CommonRoleBuilder extends Builder{
private Role role = new Role();
@Override
public void buildHead() {
role.setHead("common head");
}
@Override
public void buildFace() {
role.setFace("common face");
}
@Override
public void buildBody() {
role.setBody("common body");
}
@Override
public void buildHp() {
role.setHp(100d);
}
@Override
public void buildSp() {
role.setSp(100d);
}
@Override
public void buildMp() {
role.setMp(100d);
}
@Override
public Role getResult() {
return role;
}
}
/**
* @author : jzb219@gmial.com
* @description : 具体建造者
* @date : 2018/7/26 上午10:29
*/
public class SpuerRoleBuilder extends Builder {
private Role role = new Role();
@Override
public void buildHead() {
role.setHead("super head");
}
@Override
public void buildFace() {
role.setFace("super face");
}
@Override
public void buildBody() {
role.setBody("super body");
}
@Override
public void buildHp() {
role.setHp(1000d);
}
@Override
public void buildSp() {
role.setSp(1000d);
}
@Override
public void buildMp() {
role.setMp(1000d);
}
@Override
public Role getResult() {
return role;
}
}
指挥者
/**
* @author : jzb219@gmial.com
* @description : 指挥者
* @date : 2018/7/26 上午10:34
*/
public class Director {
public void construct (Builder builder){
builder.buildBody();
builder.buildHead();
builder.buildFace();
builder.buildHp();
builder.buildMp();
builder.buildSp();
}
}
测试
/**
* @author : jzb219@gmial.com
* @description : 测试类
* @date : 2018/7/26 上午10:36
*/
public class BuilderMain {
public static void main(String[] args) {
Director director = new Director();
Builder commonBuilder = new CommonRoleBuilder();
director.construct(commonBuilder);
Role commonRole = commonBuilder.getResult();
System.out.println(commonRole);
}
}
测试结果
head=common head,face=common face,body=common body,hp=100.0,sp=100.0,mp=100.0
- 分析
- 在建造者模式中,引入了指挥者角色Director,主要的作用为
- 隔离了客户端与生产过程
- 负责控制产品的生产过程
- 指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完成的产品对象
- 建造者模式优点
- 客户端不需要知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
- 每个具体的建造者都相对独立,而与其他的具体建造者无关,因此可以很方便的替换具体的建造者或者增加新的具体建造者,用户使用不同的建造者即可得到不同的产品对象
- 可以更加精细的控制产品的创建过程。
- 增加新的具体建造者无需修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合开闭原则
- 建造者模式缺点
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很强,则不适合使用建造者模式,因此使用范围受到一定的限制
- 如果产品内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大
- 适用环境
- 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
- 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
- 对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
- 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
- 参考
http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html
http://www.hollischuang.com/archives/1477
写在最后
做一个灵魂和肉体分离的人,灵魂不受肉体的束缚,灵魂可以指挥肉体