Loading...

初识设计模式之建造者模式

一、为什么要用建造者模式

建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。让在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。比如我们现在需要组一台主机,但是不需要知道各个部件是怎么开发的,我们只需要按照需求购买相关的部件,就可以进行组装了。

二、怎么用建造者模式

​ 我们将会使用以下的几个类:

  • 产品类:描述产品的信息
  • 抽象建造者类:生产产品部件的类,作为抽象类,具体实现方法交由建造者类实现
  • 建造者类:继承抽象建造者类,描述产品部件的生产方法,返回产品
  • 指导类:指导建造者去完成产品的开发
//产品类,在这里作为描述主机的类
class HostProduct{
	String CPU;
	String DisplayCard;
	String SoundCard;
	
	public String getCPU() {
		return CPU;
	}
	public HostProduct setCPU(String cPU) {
		CPU = cPU;
		return this;
	}
	public String getDisplayCard() {
		return DisplayCard;
	}
	public HostProduct setDisplayCard(String displayCard) {
		DisplayCard = displayCard;
		return this;
	}
	public String getSoundCard() {
		return SoundCard;
	}
	public HostProduct setSoundCard(String soundCard) {
		SoundCard = soundCard;
		return this;
	}
	@Override
	public String toString() {
		return "HostProduct [CPU=" + CPU + ", DisplayCard=" + DisplayCard + ", SoundCard=" + SoundCard + "]";
	}
}

//抽象建造者类,描述了其中的方法
abstract class AbstractHostBuilder{
	abstract HostBuilder setProduct(String cPU,String displayCard,String soundCard);
	abstract HostProduct build();
}

//建造者类,对产品类进行了组装
class HostBuilder extends AbstractHostBuilder{
	HostProduct hp = new HostProduct();
	
	public HostBuilder setProduct(String cPU,String displayCard,String soundCard) {
		hp.setCPU(cPU).setDisplayCard(displayCard).setSoundCard(soundCard);
		return this;
	}
	
	public HostProduct build() {
		return hp;
	}
}

//指挥者类
public class Director {
	public static void main(String[] args) {
		
		HostProduct hp = new HostProduct();
		HostBuilder builder = new HostBuilder();
		
		//只需要我们给定所需要的显卡型号等等就可以得到相应的显卡等等了
		Object obj = builder.setProduct("xxx", "yyy", "zzz").build();
		
		System.out.println(obj);	
	}
}

三、建造者模式再理解

优点:

  • 使用建造者模式可以使客户端不必知道产品内部组成的细节。
  • 具体的建造者类之间是相互独立的,这有利于系统的扩展。
  • 具体的建造者相互独立,因此可以对建造的过程逐步细化,而不会对其他模块产生任何影响。

缺点:

  • 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。

  • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

可以考虑使用的场景:

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同表示时。
posted @ 2020-09-07 16:43  _轻舟  阅读(171)  评论(0编辑  收藏  举报