创建者模式:
1.使用场景:
1.1.当生产的产品对象内部比较复杂时(对象构造和表示分离)
1.2.当复杂对象需要与表示分离,可能需要创建不同的表示时。
1.3.当需要向客户隐藏产品内部结构的表现时(客户不需要知道内部具体实现,只需要知道通过指导者,可以生产出相对应的产品)
2.建造者模式与抽象工厂模式的区别:
2.1工厂模式是解决产品系列家族的一种模式
2.2 建造者模式是解决一个对象部分需求变化的一种设计模式
1. 建造者模式的优点
- 封装性
使用建造者模式可以使客户端不必知道产品内部组成的细节,如例子中我们就不需要关心每一个具体的模型内部是如何实现的,产生的对象类型就是CarModel。
- 建造者独立,容易扩展
Builder之间是相互独立的,与其它的Builder无关,对系统的扩展非常有利。
- 便于控制细节风险
模式所建造的最终产品更易于控制:由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
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.创建套餐类对应的接口 IMobileBuilderpublic 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);