设计模式之建造者模式、模版方法

1、建造者模式

file

建造者模式:是将一个复杂的对象的构建与它的表示分离,使得一样的构建过程能够建立不一样的表示。java

工厂类模式提供的是建立单个类的模式,而建造者模式则是将各类产品集中起来进行管理,用来建立复合对象,所谓复合对象就是指某个类具备不一样的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来获得的。算法

建造者模式一般包括下面几个角色:数组

  • 一、Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的建立,并不涉及具体的对象部件的建立。
  • 二、ConcreteBuilder:实现Builder接口,针对不一样的商业逻辑,具体化复杂对象的各部分的建立。 在建造过程完成后,提供产品的实例。
  • 三、Director:调用具体建造者来建立复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整建立或按某种顺序建立。
  • 四、Product:要建立的复杂对象。

一、建造者应用场景

  • 一、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是常常变化的,生成出所谓的"套餐"。 19元每周三 汉堡+可乐+薯条=套餐可能会发生改变。
  • 二、JAVA 中的 StringBuilder 数组(单个字符)字整合在一块儿 字符串

使用场景:ide

  • 一、须要生成的对象具备复杂的内部结构。
  • 二、须要生成的对象内部属性自己相互依赖。

与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。测试

二、 创建一我的物对象Person

public class Person {

	private String head;
	private String body;
	private String foot;

	public String getHead() {
		return head;
	}

	public void setHead(String head) {
		this.head = head;
	}

	public String getBody() {
		return body;
	}

	public void setBody(String body) {
		this.body = body;
	}

	public String getFoot() {
		return foot;
	}

	public void setFoot(String foot) {
		this.foot = foot;
	}

}

1)、Builder(给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的建立,并不涉及具体的对象部件的建立)

public interface PersonBuilder {

	void builderHead();

	void builderBody();

	void builderFoot();

	Person BuilderPersion(); //组装
}

2)、ConcreteBuilder(实现Builder接口,针对不一样的商业逻辑,具体化复杂对象的各部分的建立。 在建造过程完成后,提供产品的实例)

public class ManBuilder implements PersonBuilder {
	private Person person;

	public ManBuilder() {
		person = new Person();//建立一个Person实例,用于调用set方法
	}

	public void builderHead() {
		person.setHead("建造者头部分");
	}

	public void builderBody() {
		person.setBody("建造者身体部分");
	}

	public void builderFoot() {
		person.setFoot("建造者头四肢部分");
	}

	public Person BuilderPersion() {
		return person;
	}

}

3)、Director(调用具体建造者来建立复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整建立或按某种顺序建立)

public class PersonDirector {

	public Person constructPerson(PersonBuilder pb) {
		pb.builderHead();
		pb.builderBody();
		pb.builderFoot();
		return pb.BuilderPersion();
	}

	public static void main(String[] args) {
		PersonDirector pb = new PersonDirector();
		Person person = pb.constructPerson(new ManBuilder());
		System.out.println(person.getHead());
		System.out.println(person.getBody());
		System.out.println(person.getFoot());
	}
}

2、模板方法

一、模板方法模式:

定义一个操做中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类能够不改变一个算法的结构便可重定义该算法的ui

重复代码所有在父类里面,不一样业务的,抽取给子类进行实现。抽取过程---抽象方法。this

某些特定步骤。lua

核心:处理某个流程的代码已经都具有,可是其中某个节点的代码暂时不能肯定。所以,咱们采用工厂方法模式,将这个节点的代码实现转移给 子类完成。即:处理步骤在父类中定义好,具体的实现延迟到子类中定义。code

说白了,就是将一些相同操做的代码,封装成一个算法的骨架。核心的部分留在子类中操做,在父类中只把那些骨架作好。 例如: 例如:对象

  • 1.去银行办业务,银行给咱们提供了一个模板就是:先取号,排对,办理业务(核心部分咱们子类完成),给客服人员评分,完毕。

这里办理业务是属于子类来完成的,其余的取号,排队,评分则是一个模板。

  • 2.去餐厅吃饭,餐厅给提供的一套模板就是:先点餐,等待,吃饭(核心部分咱们子类完成),买单 这里吃饭是属于子类来完成的,其余的点餐,买单则是餐厅提供给咱们客户的一个模板。

file

二、模板方法具体实现

这里使用银行办理业务为例

1)首先,定义一个模板。模板中把办理业务用做核心部分,让子类来实现。

//模板方法
public abstract class BankTemplateMethod {

	// 1.取号排队
	public void takeNumber() {
		System.out.println("取号排队。。");
	}

	// 2.每一个子类不一样的业务实现,由各自子类实现.
	abstract void transact();

	// 3.评价
	public void evaluate() {
          System.out.println("反馈评价..");
	}
	
	public void process(){
		takeNumber();
		transact();
		evaluate();
	}
}

2)具体的模板方法的子类

public class DrawMoney extends BankTemplateMethod {
	@Override
	void transact() {
		System.out.println("我要取款");
	}
}

3)客户端测试

public class Client {

	 public static void main(String[] args) {
		 BankTemplateMethod bankTemplate=new DrawMoney();
		 bankTemplate.process();
	}
	
}

4)匿名内部类方式

BankTemplateMethod bankTemplateMethod=new BankTemplateMethod() {
			
			@Override
			void transact() {
				System.out.println("我要存钱.");
				
			}
		};
		bankTemplateMethod.process();

我的博客 蜗牛

相关文章
相关标签/搜索