设计模式3-建造者模式
一、建造者模式是什么:
建造者模式是设计模式的一种,将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。
二、建造者模式原理:
将多个对象之间变化和不变化的分离开来,再加上一个创建管理类来管理区分。
三、建造者模式优劣点:
优点:1.建造者独立,,易扩展。2.便于控制细节风险。3.使用者来说比较方便,只是引用其简单的属性方法来就可以达到期望。
缺点:1.产品必须有共同点,范围有限制。2.入内部变化复杂,会有很多的建造类。3.难维护,使用者想修改其内部比较难
四、建造者模式应用场景:
1.在对象内部复杂的地方使用,2.需生成的内部对象之间有共同的属性
五、建造者模式注意事项:
建造者模式和工厂模式非常相似,工厂模式是建造者的最简单的一种形式。
六、建造者模式实现例子:
1.抽象产品类Item,Packing,Buger;Bottle,Wrapper:
Item(菜单项)
public interface Item {
public String name();
public Packing packing();
public float price();
}
Packing(包装)
public interface Packing {
public String pack();
}
Burger(汉堡)
public abstract class Burger implements Item{
public Packing packing() {
// TODO Auto-generated method stub
return new Wrapper();
}
public abstract float price();
}
Bottle(瓶子)
public class Bottle implements Packing {
public String pack() {
// TODO Auto-generated method stub
return "Bottle";
}
}
Wrapper(封装)
public class Wrapper implements Packing {
public String pack() {
// TODO Auto-generated method stub
return "Wrapper";
}
}
2.具体产品类:ChickenBurger,Coke,ColdDrink,Pepsi
ChickenBurger(鸡肉汉堡)
public class ChickenBurger extends Burger {
public String name() {
// TODO Auto-generated method stub
return "Chicken Burger";
}
@Override
public float price() {
// TODO Auto-generated method stub
return 50.5f;
}
}
Coke(蛋糕)
public class Coke extends ColdDrink {
public String name() {
// TODO Auto-generated method stub
return "Coke";
}
@Override
public float price() {
// TODO Auto-generated method stub
return 3.25f;
}
ColdDrink(冷饮)
public abstract class ColdDrink implements Item {
public Packing packing() {
// TODO Auto-generated method stub
return new Bottle();
}
public abstract float price();
}
Pepsi(百事可乐)
public class Pepsi extends ColdDrink {
public String name() {
// TODO Auto-generated method stub
return "Pepsi";
}
@Override
public float price() {
// TODO Auto-generated method stub
return 36.2f;
}
}
3.构造者具体类:Menu,MenuBuilder
Menu(菜单)
public class Menu {
private List<Item> items =new ArrayList<Item>();
public void addItem(Item item){
items.add(item);
}
public float getCost(){
float cost =0.0f;
for(Item item :items){
cost +=item.price();
}
return cost;
}
public void showItems(){
for(Item item :items){
System.out.print("Item:"+item.name());
System.out.print(",Packing:"+item.packing());
System.out.println(",Price:"+item.price());
}
}
}
MenuBuilder(菜单管理者)
public class MenuBuilder {
public Menu prepareVegMenu(){
Menu menu = new Menu();
menu.addItem(new ChickenBurger());
menu.addItem( new Coke());
return menu;
}
public Menu prepareNonMenu(){
Menu menu = new Menu();
menu.addItem(new ChickenBurger());
menu.addItem( new Pepsi());
return menu;
}
}
4.成果显示类:Demo
public class Demo {
public static void main(String[] args){
MenuBuilder mealBuilder = new MenuBuilder();
Menu vegMenu = mealBuilder.prepareVegMenu();
System.out.println("Veg Meal");
vegMenu.showItems();
System.out.println("Total Cost: " +vegMenu.getCost());
Menu nonVegMenu = mealBuilder.prepareNonMenu();
System.out.println("\n\nNon-Veg Meal");
nonVegMenu.showItems();
System.out.println("Total Cost: " +nonVegMenu.getCost());
}
}
5.结果: