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了。