建造者模式
设计模式
建造者模式
建造者模式将复杂对象的创建与表示分离, 使得同样的构建过程可以创建不同的表示. 客户端通过指导者获得最终产品, 指导者通过建造者构造具体产品, 最终的产品通过建造者返回给指导者.
设计原则
- 分步骤创建复杂对象, 使构建复杂对象变得不那么复杂;
- 构建和表示分离, 更好地适应外部需求的变化; 构建和表示分离还存在这样一个优势: 构造的部分实现比较灵活, 外部需求变化比较大, 但是获得实例对象的过程是统一的, 也就是说无论外部存在多少需求, 变化, 都只不过是对象的表现形式不同罢了. 因些建造者模式对于复杂对象的创建具有其它模式不能替代的优势
- 单一职责原则, 提高软件内部的聚合度, 降低模块之间的耦合度.
Java JDK中的建造者模式
- java.lang.StringBuffer和java.lang.StringBuilder, 两者实现的功能是一样的, 都实现字符串缓冲区功能, 将数据转换成字符串
- StringBuffer是线程安全的, 而StringBuilder是线程不安全的.
- 不考虑多线程的因素, StringBuilder的效率比StringBuffer的效率要高一些.
建造者模式和抽象工厂模式的区别
- 建造者模式着重于分步骤构造一个复杂对象, 而抽象工厂模式则着重于多个系列的产品对象即对象族(简单或复杂的)的构造;
- 建造者模式是在最后一步返回具体产品, 而抽象工厂模式则是立即返回具体产品.
建造者模式的使用场合
- 当生成的产品对象内部具有复杂的结构时;
- 当复杂对象需要表示分离, 可能需要创建不同的表示时;
- 当需要向客户隐藏产品内部结构的表现时.
实现代码
//手机套餐 public class MobilePackage03 { private float money; private int shortInfo; private String music; public float getMoney() { return money; } public void setMoney(float money) { this.money = money; } public int getShortInfo() { return shortInfo; } public void setShortInfo(int shortInfo) { this.shortInfo = shortInfo; } public String getMusic() { return music; } public void setMusic(String music) { this.music = music; } }
//建造者接口 public interface IMobileBuilder03 { public void buildMoney(); public void buildShortInfo(); public void buildMusic(); public MobilePackage03 getMobilePackage(); }
//抽象建造者 public abstract class AbstractBasePackage03 { protected MobilePackage03 mobilePackage03; public AbstractBasePackage03() { this.mobilePackage03 = new MobilePackage03(); } }
//具体的建造者 public class MobileBuilderImp1103 extends AbstractBasePackage03 implements IMobileBuilder03 { public void buildMoney() { this.mobilePackage03.setMoney(11f); } public void buildShortInfo() { this.mobilePackage03.setShortInfo(100); } public void buildMusic() { this.mobilePackage03.setMusic("1103"); } public MobilePackage03 getMobilePackage() { return this.mobilePackage03; } }
//具体的建造者 public class MobileBuilderImp2203 extends AbstractBasePackage03 implements IMobileBuilder03 { public void buildMoney() { this.mobilePackage03.setMoney(20f); } public void buildShortInfo() { this.mobilePackage03.setShortInfo(200); } public void buildMusic() { this.mobilePackage03.setMusic("2203"); } public MobilePackage03 getMobilePackage() { return this.mobilePackage03; } }
//手机套餐指导者 public class MobileDirector03 { public MobilePackage03 createMobilePackage03(IMobileBuilder03 builder03) { if(null != builder03) { builder03.buildMoney(); builder03.buildShortInfo(); builder03.buildMusic(); return builder03.getMobilePackage(); } return null; } }
//客户端 public class MobileMain { public static void main(String[] args) { MobileDirector03 director03 = new MobileDirector03(); MobileBuilderImp1103 imp1103 = new MobileBuilderImp1103(); MobileBuilderImp2203 imp2203 = new MobileBuilderImp2203(); printMessage(director03.createMobilePackage03(imp1103)); printMessage(director03.createMobilePackage03(imp2203)); } public static void printMessage(MobilePackage03 package03) { System.out.println("---话费: " + package03.getMoney() + "\t 短信: " + package03.getShortInfo() + "\t 彩铃: " + package03.getMusic()); } }