常用设计模式——创建者模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenbetter1996/article/details/88542774

个人整合学习自

  1. 《Java设计模式》 刘伟 编著

模式概述

Builder Pattern: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。也是一种创建型模式。

  1. Builder(抽象建造者):接口、抽象类,一般包括builderPartX()和getResult()两种方法
  2. ConcreteBuilder(具体创建者):实现类
  3. Product(产品):被构建的复杂对象
  4. Director(指挥者):负责安排负责对象的建造次序,内写construct()建造方法中调用建造者对象的部件的构造或者装配方法,完成复杂对象的构建。

案例

  1. 汽车有很多组件,如方向盘,发动机,轮胎等,将创建和组装分开。关照一步一步地创建一个包含多个组成部分的复杂对象。
  2. 游戏的角色:有英雄、天使、恶魔等角色,以下也是使用这个做实例。
package xyz.cglzwz.designpattern.bp;

/**
 * 游戏角色创建者,充当抽象创建者
 * 
 * @author chgl16
 * @date 2019-03-13
 */

public abstract class ActorBuilder {
	// 让具体的创建者类调用这个对象
	protected Actor actor = new Actor();
	
	public abstract void buildType();
	public abstract void buildSex();
	public abstract void buildFace();
	public abstract void buildCostume();
	
	/**
	 * 工厂方法,返回一个完整的游戏角色
	 * 
	 * @return
	 */
	public Actor createActor() {
		return actor;
	}
}
package xyz.cglzwz.designpattern.bp;

/**
 * 英雄角色创建者,充当具体创建者
 * 
 * @author chgl16
 * @date 2019-03-13
 */

public class HeroBuilder extends ActorBuilder {

	@Override
	public void buildType() {
		// 调用父类的对象
		actor.setType("英雄");
	}

	@Override
	public void buildSex() {
		actor.setSex("男");
	}

	@Override
	public void buildFace() {
		actor.setFace("英俊");
	}

	@Override
	public void buildCostume() {
		actor.setCostume("汉服");
	}
}
package xyz.cglzwz.designpattern.bp;

/**
 * 天使角色创建者,充当具体创建者
 * 
 * @author chgl16
 * @date 2019-03-13
 */

public class AngelBuilder extends ActorBuilder {

	@Override
	public void buildType() {
		actor.setType("天使");
	}

	@Override
	public void buildSex() {
		actor.setSex("女");
	}

	@Override
	public void buildFace() {
		actor.setFace("美丽");
	}

	@Override
	public void buildCostume() {
		actor.setCostume("白裙");
	}
}
package xyz.cglzwz.designpattern.bp;

/**
 * 恶魔角色创建者,充当具体创建者
 * 
 * @author chgl16
 * @date 2019-03-13
 */

public class DevilBuilder extends ActorBuilder {

	@Override
	public void buildType() {
		// 调用父类的对象
		actor.setType("恶魔");
	}

	@Override
	public void buildSex() {
		actor.setSex("男");
	}

	@Override
	public void buildFace() {
		actor.setFace("恐怖");
	}

	@Override
	public void buildCostume() {
		actor.setCostume("黑衣");
	}
}
package xyz.cglzwz.designpattern.bp;

/**
 * 游戏角色类,充当复杂产品对象
 * 
 * @author chgl16
 * @date 2019-03-13
 */

public class Actor {
	// 角色类型
	private String type;
	// 性别
	private String sex;
	// 脸型
	private String face;
	// 服装
	private String costume;
	
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getFace() {
		return face;
	}
	public void setFace(String face) {
		this.face = face;
	}
	public String getCostume() {
		return costume;
	}
	public void setCostume(String costume) {
		this.costume = costume;
	}
}
package xyz.cglzwz.designpattern.bp;

/**
 * 角色控制器,充当指挥者
 * 
 * @author chgl16
 * @date 2019-03-13
 */

public class ActorController {
	/**
	 * 逐步构造复杂产品对象
	 * 
	 * @param actorBuilder
	 * @return
	 */
	public Actor construct(ActorBuilder actorBuilder) {
		actorBuilder.buildType();
		actorBuilder.buildSex();
		actorBuilder.buildFace();
		actorBuilder.buildCostume();
		
		return actorBuilder.createActor();
	}
}
package xyz.cglzwz.designpattern.bp;

public class App {	
	public static void main(String[] args) {
		ActorBuilder actorBuilder = new HeroBuilder();
		ActorController ac = new ActorController();
		Actor actor = ac.construct(actorBuilder);
		
		System.out.println(actor.getType());
		System.out.println(actor.getSex());
		System.out.println(actor.getFace());
		System.out.println(actor.getCostume());
		System.out.println("--------------");
		
		// 切换为创建天使
		actorBuilder = new AngelBuilder();
		actor = ac.construct(actorBuilder);
		
		System.out.println(actor.getType());
		System.out.println(actor.getSex());
		System.out.println(actor.getFace());
		System.out.println(actor.getCostume());
	}
}
英雄
男
英俊
汉服
--------------
天使
女
美丽
白裙

优缺点

优点

  1. 客户端不必要知道产品内部组成的细节,将产品本身与产品的创建过程解耦,可以创建多种不同产品。
  2. 具体建造者相互独立,方便。需要新增即可,满足开闭原则。

缺点

  1. 要求不同产品的共同点要很多,组件很类似,不然差异大的话,不适合了

猜你喜欢

转载自blog.csdn.net/chenbetter1996/article/details/88542774