建造者模式
-
疑问:
-
建造者模式和抽象工厂模式的区别:
-
建造者模式所有函数加到一起才能生成一个对象,抽象工厂一个函数生成一个对象。
-
建造者模式就像如今的全球化分工合作,而抽象工厂更像是现在工厂的生产线,一条流水线生产出一种产品。
-
-
-
定义:
将一个复杂对象的构建和它的表示分离,使用同样的构建可以创建不同的表示。从定义来看,建造者模式适合于一个复杂对象的建造,而在建造过程中,客户端不必知道产品内部组成的细节。
-
使用场景:
- 适用于一个具有较多零件的复杂产品的创建过程,复杂产品的各个零件经常变化,建造者模式组合的对象相对稳定。
- 相同的方法,不同的执行顺序,产生不同的结果。
- 多个零件都可以装配到一个对象,但是产生的结果又不相同。
- 产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用。
- 当初始化一个对象特别复杂,参数特别多,而且很多参数都具有默认值。
-
UML:
- Product:产品角色。
- Builder:抽象建造者。
- ConcreteBuilder:具体的建造者。
- Director:指挥者。
-
优点:
- 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
- 每一个具体建造者都相对独立,与其他具体建造者无关,可以方便替换或者增加具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
- 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类变成,系统扩展方便,符合 开闭原则 。
-
缺点:
- 建造者模式所创建的产品一般又较多的共同点,组成部分相似,如果产品之间的差异性过大,则不适合建造者模式,因此其使用的范围会受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多的具体建造者类实现变化,导致系统变得分庞大。
-
样例:
public class Bike{ private IFrame frame ; private ISeat seat ; private ITire tire ; public IFrame getFrame() { return frame; } public void setFrame(IFrame frame) { this.frame = frame; } public ISeat getSeat() { return seat; } public void setSeat(ISeat seat) { this.seat = seat; } public ITire getTire() { return tire; } public void setTire(ITire tire) { this.tire = tire; } }
public abstract class Builder{ abstract void buildFrame() ; abstract void buildSeat() ; abstract void buildTire() ; abstract Bike createBike() ; }
public class MobikeBuilder extends Builder{ private Bike mBike = new Bike(); @Override void buildFrame() { mBike.setFrame(new AlloyFrame()); } @Override void buildSeat() { mBike.setSeat(new DermisSeat()); } @Override void buildTire() { mBike.setTire(new SolidTire()); } @Override Bike createBike() { return mBike; } } public class OfoBuilder extends Builder{ private Bike mBike = new Bike(); @Override void buildFrame() { mBike.setFrame(new CarbonFrame()); } @Override void buildSeat() { mBike.setSeat(new RubberSeat()); } @Override void buildTire() { mBike.setTire(new InflateTire()); } @Override Bike createBike() { return mBike; } }
public class Director{ private Builder mBuilder = null ; public Director(Builder builder){ mBuilder = builder ; } public Bike construct(){ mBuilder.buildFrame() ; mBuilder.buildSeat() ; mBuilder.builderTire() ; return mBuilder.createBike() ; } }