建造者模式是什么
建造者模式属于创建型设计模式,它提供了一种创建对象的最佳方式,使用多个简单的对象一步一步构建成一个复杂的对象,在用户不知道建造过程和细节的情况下直接创建复杂的对象。调用者只需要给出指定复杂对象的类型和内容,建造者复杂按照顺序创建复杂对象。例如用户购买笔记本:用户并不需要知道笔记本组成的细节以及如何组装,只需要告诉需要购买的牌子和配置即可。
建造者模式的优缺点
优点
产品的建造和表示分离,实现解耦。客户端不需要知道内部的组成和建造细节。 将复杂产品的创建过程分解在不同的方法,使得创建过程更加清晰。便于控制细节风险。 各个建造类之间是互相独立的,有利于系统的扩展。增加建造者无需修改原有类库的代码,符合开闭原则。
缺点
建造者模式所创建产品一般需要具备较多的共同点,使用范围有所限制。 如果产品内部变化复杂,可能导致需要定义许多创建类来实现这种变化,导致系统变的庞大。
使用场景
1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
建造者模式和抽象工厂模式比较
建造者模式相对于抽象工厂模式,建造者能返回一个组装好的完整产品对象,而抽象工厂模式返回一个类型的产品。
建造者模式相对于抽象工厂模式,建造者客户端不能直接调用建造者相关方法,而是通过指挥者来指导如何生成对象,包括对象的组装过程和建造过程,它侧重于一步步构建复杂对象,返回一个完整对象。抽象工厂模式中,客户端实例工厂类,然后调用工厂中的方法获取所需对象。
建造者模式相对于抽象工厂模式,建造者类模式似于一个汉堡店的一个套餐,服务员根据你点的套餐对汉堡和饮品以及各种东西打包给你一个完整的套餐。抽象工厂模式类似于汉堡店套餐中的一类产品,只生产一类产品中对应的物品。
建造者模式角色描述
产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
辅助图示
如上图所示
由一个抽象建造者、两个具体建造者、所要建造的产品BugerMealProduct、和指挥建造者正确生成的指挥者构成。
示例代码
1、打包方式
public interface Package { String PackageType(); }
2、汉堡店饮品
public interface Drink extends Package{ String drinkName(); float drinkPrice(); }
3、汉堡店汉堡
public interface Buger extends Package{ String bugerName(); float bugerPrice(); }
4、汉堡店饮品具体实现
public class PepsiDrink implements Drink{ @Override public String drinkName() { return "百事可乐"; } @Override public float drinkPrice() { return 6.0F; } @Override public String PackageType() { return "瓶子打包"; } }
public class CocaColaDrink implements Drink{ @Override public String drinkName() { return "可口可乐"; } @Override public float drinkPrice() { return 8.0f; } @Override public String PackageType() { return "瓶子打包"; } }
5、汉堡店汉堡实现
public class ChickenBuger implements Buger{ @Override public String bugerName() { return "鸡肉汉堡"; } @Override public float bugerPrice() { return 20f; } @Override public String PackageType() { return "盒子打包"; } }
public class BeefBuger implements Buger{ @Override public String bugerName() { return "牛肉汉堡"; } @Override public float bugerPrice() { return 25f; } @Override public String PackageType() { return "盒子打包"; } }
6、抽象建造者
abstract class Builder { protected BugerMealProduct bugerMealProduct = new BugerMealProduct(); public abstract void buildPartA(); public abstract void buildPartB(); //返回产品对象 public BugerMealProduct getResult() { System.out.println("套餐为:" + bugerMealProduct.getBuger().bugerName() + " + " + bugerMealProduct.getDrink().drinkName() + " 价格为:" + (bugerMealProduct.getBuger().bugerPrice() + bugerMealProduct.getDrink().drinkPrice())); return bugerMealProduct; } }
7、具体建造者
public class ConcreteBuilderOne extends Builder{ @Override public void buildPartA() { bugerMealProduct.setBuger(new BeefBuger()); } @Override public void buildPartB() { bugerMealProduct.setDrink(new PepsiDrink()); } }
public class ConcreteBuilderTwo extends Builder{ @Override public void buildPartA() { bugerMealProduct.setBuger(new ChickenBuger()); } @Override public void buildPartB() { bugerMealProduct.setDrink(new CocaColaDrink()); } }
8、指挥者
public class Director { private Builder builder; public Director(Builder builder) { this.builder = builder; } public BugerMealProduct construct(){ builder.buildPartA(); builder.buildPartB(); return builder.getResult(); } }
9、客户端
public class TestClient { public static void main(String[] args) { //构建两个完整的汉堡套餐给客户 BugerMealProduct bugerMealProductOne = new Director(new ConcreteBuilderOne()).construct(); BugerMealProduct bugerMealProductTwo = new Director(new ConcreteBuilderTwo()).construct(); } }
运行结果