`
java-mans
  • 浏览: 11456833 次
文章分类
社区版块
存档分类
最新评论

建造者模式

 
阅读更多

1.概念

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 [构建与表示分离,同构建不同表示]

与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。

  建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。

  举个简单的例子,如汽车,有很多部件,车轮,方向盘,发动机还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一部汽车,这个装配过程也很复杂(需要很好的组装技术), builder模式就是为了将部件和组装分开。

2.UML图

3.下面看下我的一个小例子

(1)先来写2个接口一个用于鸭子的飞行,一个用于鸣叫

package org.lxh.dao;
//鸭子的飞行(并不是所有的鸭子都会飞行)
public interface FlyBehavior {
  public void fly();
}

package org.lxh.dao;
//鸭子的发声(并不是所有的鸭子都会叫)
public interface QuackBehavior {
   public void quack();
}

(2)接口的实现类

package org.lxh.impl;

import org.lxh.dao.FlyBehavior;

public class FlyNoWay implements FlyBehavior{

	public void fly() {
		System.out.println("我不会飞行");
	}

}

package org.lxh.impl;

import org.lxh.dao.FlyBehavior;

public class FlyWithWings implements FlyBehavior{

	public void fly() {
	   System.out.println("我使用翅膀飞行");
	}

}

package org.lxh.impl;

import org.lxh.dao.QuackBehavior;

public class Squack implements QuackBehavior{

	
	public void quack() {
		 System.out.println("咯咯咯咯");
		
	}

}

package org.lxh.impl;

import org.lxh.dao.QuackBehavior;

public class Quack implements QuackBehavior{

	
	public void quack() {
	  System.out.println("呱呱呱呱");
		
	}

}


(3)下面便是最重要的建造工具了,这里使用的是抽象类,不适用抽象类也是可以的

package org.lxh.builder;

import org.lxh.dao.FlyBehavior;
import org.lxh.dao.QuackBehavior;

public abstract class Duck {
  //先声明2个接口分别是飞行和鸣叫
	FlyBehavior flyBeBehavior;
	QuackBehavior quackBeBehavior;
	public Duck(){
		
	}
	//鸭子具体的飞行和鸣叫
	public void showFly(){
		flyBeBehavior.fly();
	}
	public void showQuack(){
		quackBeBehavior.quack();
	}
}

(4)指导者或建造者具体的事物这里就是我们要用到的黑鸭子和蓝鸭子
package org.lxh.builder;

import org.lxh.dao.FlyBehavior;
import org.lxh.impl.FlyWithWings;
import org.lxh.impl.Quack;

public class BlackDuck extends Duck{

	public BlackDuck() {
		//黑色鸭子使用翅膀飞行
		flyBeBehavior=new FlyWithWings();
		//黑色鸭子呱呱叫
		quackBeBehavior=new Quack();
	}
    
}

package org.lxh.builder;

import org.lxh.impl.FlyNoWay;
import org.lxh.impl.FlyWithWings;
import org.lxh.impl.Quack;
import org.lxh.impl.Squack;

public class BlueDuck extends Duck{
	public BlueDuck()
	{
		//黑色鸭子使用翅膀飞行
		flyBeBehavior=new FlyNoWay();
		//黑色鸭子呱呱叫
		quackBeBehavior=new Squack();
	}
}

(5)到这里代码就写完了,下面就是我的单元测试了

package org.lxh.test;

import org.lxh.builder.BlackDuck;
import org.lxh.builder.BlueDuck;
import org.lxh.builder.Duck;


public class TestBuilder {
   @org.junit.Test
   public void TestBlack(){
	   System.out.println("我是黑鸭子============");
	   Duck duck=new BlackDuck();
	   duck.showFly();
	   duck.showQuack();
   }
   @org.junit.Test
   public void TestBlue(){
	   System.out.println("我是蓝鸭子=============");
	   Duck duck=new BlueDuck();
	   duck.showFly();
	   duck.showQuack();
   }
}

下面是运行效果图,代码大家到我的资源里找就OK了。




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics