设计模式之建造者模式

创建者模式:

1.使用场景:

1.1.当生产的产品对象内部比较复杂时(对象构造和表示分离)

1.2.当复杂对象需要与表示分离,可能需要创建不同的表示时。

1.3.当需要向客户隐藏产品内部结构的表现时(客户不需要知道内部具体实现,只需要知道通过指导者,可以生产出相对应的产品)

2.建造者模式与抽象工厂模式的区别:

2.1工厂模式是解决产品系列家族的一种模式

2.2 建造者模式是解决一个对象部分需求变化的一种设计模式


1. 建造者模式的优点

  • 封装性

      使用建造者模式可以使客户端不必知道产品内部组成的细节,如例子中我们就不需要关心每一个具体的模型内部是如何实现的,产生的对象类型就是CarModel。

  • 建造者独立,容易扩展

      Builder之间是相互独立的,与其它的Builder无关,对系统的扩展非常有利。

  • 便于控制细节风险

      模式所建造的最终产品更易于控制:由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

2. 建造者模式的使用场景

  • 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式,需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式是非常合适。
  • 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。该种场景,只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反设计最初目标。

3. 建造者模式的注意事项

      建造者模式关注的是的零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建类模式,但是注重点不同。

和其他模式的区别:

     
  1. 与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。
  2. 在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象。
  3. 如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车。

demo:

 1.需创建对象的抽象类  abstractMobilePackage,包含一些公共属性

public class abstractMobilePackage {

privatefloat money;

privateint shortInfo;// 短信条数


private Stringmusic;// 彩玲


publicfloat getMoney() {

returnmoney;

}


publicvoid setMoney(float money) {

this.money = money;

}


publicint getShortInfo() {

returnshortInfo;

}


publicvoid setShortInfo(int shortInfo) {

this.shortInfo = shortInfo;

}


public String getMusic() {

returnmusic;

}

publicvoid setMusic(String music) {

this.music = music;

}

}

2.创建套餐类对应的接口 IMobileBuilder

public interface IMobileBuilder {

publicvoid buildMoney();


publicvoid buildShortInfo();


publicvoid buildMusic();


public abstractMobilePackage getMobilePackage();//定义的接口中,包含完整对象的引用,在指导者或者接口实现类中返回套餐完整对象

publicvoid printsystem();


}

3.套餐1  mobilePackageImpl1 


/**20元 400条短信 套餐*/

public class mobilePackageImpl1 extends abstractMobilePackageimplements

IMobileBuilder {


@Override

publicvoid buildMoney() {

this.setMoney(20);

//TODO Auto-generated method stub


}


@Override

publicvoid buildShortInfo() {

this.setShortInfo(400);

//TODO Auto-generated method stub


}


@Override

publicvoid buildMusic() {

this.setMusic("套餐1的彩玲");

//TODO Auto-generated method stub


}


@Override

public abstractMobilePackage getMobilePackage() {

//TODO Auto-generated method stub

returnthis;

}

publicvoid printsystem() {

System.out.println("套餐金额:" +this.getMoney() + "\t  套餐短信条数:"

+this.getShortInfo() + "\t套餐彩玲:" +this.getMusic());

}


}

4.套餐2  mobilePackageImpl2

/**30元 600条短信 套餐*/

public class mobilePackageImpl2 extends abstractMobilePackageimplements

IMobileBuilder {


@Override

publicvoid buildMoney() {

this.setMoney(30);

//TODO Auto-generated method stub


}


@Override

publicvoid buildShortInfo() {

this.setShortInfo(600);

//TODO Auto-generated method stub


}


@Override

publicvoid buildMusic() {

this.setMusic("30元套餐的彩玲");

//TODO Auto-generated method stub


}


@Override

public abstractMobilePackage getMobilePackage() {

//TODO Auto-generated method stub

returnthis;

}

publicvoid printsystem() {

System.out.println("套餐金额:" +this.getMoney() + "\t  套餐短信条数:"

+this.getShortInfo() + "\t套餐彩玲:" +this.getMusic());

}

}

5.指导者

//指导者,主要负责初始化各种套餐

public class mobileDirector {

public IMobileBuilder createMobilePackage(IMobileBuilder mobilPackage) {

if (mobilPackage !=null) {

mobilPackage.buildMoney();

mobilPackage.buildShortInfo();

mobilPackage.buildMusic();

mobilPackage.printsystem();

return mobilPackage;

}

returnnull;

}


}

6.测试

// 找到客服人员

mobileDirector d =new mobileDirector();


mobilePackageImpl1 p1 =new mobilePackageImpl1();

d.createMobilePackage(p1);//开办第一类套餐

mobilePackageImpl2 p2=new mobilePackageImpl2();

d.createMobilePackage(p2);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值