设计模式之建造者模式

建造者模式

  • 疑问:

    1. 建造者模式和抽象工厂模式的区别:

      1. 建造者模式所有函数加到一起才能生成一个对象,抽象工厂一个函数生成一个对象。

      2. 建造者模式就像如今的全球化分工合作,而抽象工厂更像是现在工厂的生产线,一条流水线生产出一种产品。

  • 定义:

    ​ 将一个复杂对象的构建和它的表示分离,使用同样的构建可以创建不同的表示。从定义来看,建造者模式适合于一个复杂对象的建造,而在建造过程中,客户端不必知道产品内部组成的细节。

  • 使用场景:

    1. 适用于一个具有较多零件的复杂产品的创建过程,复杂产品的各个零件经常变化,建造者模式组合的对象相对稳定。
    2. 相同的方法,不同的执行顺序,产生不同的结果。
    3. 多个零件都可以装配到一个对象,但是产生的结果又不相同。
    4. 产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用。
    5. 当初始化一个对象特别复杂,参数特别多,而且很多参数都具有默认值。
  • UML:

    1. Product:产品角色。
    2. Builder:抽象建造者。
    3. ConcreteBuilder:具体的建造者。
    4. Director:指挥者。

    在这里插入图片描述

  • 优点:

    1. 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
    2. 每一个具体建造者都相对独立,与其他具体建造者无关,可以方便替换或者增加具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
    3. 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类变成,系统扩展方便,符合 开闭原则
  • 缺点:

    1. 建造者模式所创建的产品一般又较多的共同点,组成部分相似,如果产品之间的差异性过大,则不适合建造者模式,因此其使用的范围会受到一定的限制。
    2. 如果产品的内部变化复杂,可能会导致需要定义很多的具体建造者类实现变化,导致系统变得分庞大。
  • 样例:

    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() ;
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值