福州网站推广定制,做网站最下面写什么,麻将软件开发平台,网站首页需求建造者模式 摘要实现范例 建造者模式#xff08;Builder Pattern#xff09;使用多个简单的对象一步一步构建成一个复杂的对象 一个Builder 类会一步一步构造最终的对象#xff0c;该 Builder 类是独立于其他对象的 建造者模式属于创建型模式#xff0c;它提供了一种创建对… 建造者模式 摘要实现范例 建造者模式Builder Pattern使用多个简单的对象一步一步构建成一个复杂的对象 一个Builder 类会一步一步构造最终的对象该 Builder 类是独立于其他对象的 建造者模式属于创建型模式它提供了一种创建对象的最佳方式。 摘要
1. 意图
将一个复杂的构建与其表示相分离使得同样的构建过程可以创建不同的表示2. 主要解决
主要解决在软件系统中有时候面临着”一个复杂对象”的创建工作其通常由各个部分的子对象用一定的算法构成由于需求的变化这个复杂对象的各个部分经常面临着剧烈的变化但是将它们组合在一起的算法却相对稳定3. 何时使用
一些基本部件不会变而其组合经常变化的时候4. 如何解决
将变与不变分离开5. 关键代码
建造者创建和提供实例导演管理建造出来的实例的依赖关系
6. 应用实例
去肯德基汉堡、可乐、薯条、炸鸡翅等是不变的而其组合是经常变化的生成出所谓的”套餐”JAVA中的StringBuilder
7. 优点
建造者独立易扩展便于控制细节风险
8. 缺点
产品必须有共同点范围有限制如内部变化复杂会有很多的建造类
9. 使用场景
需要生成的对象具有复杂的内部结构需要生成的对象内部属性本身相互依赖
10. 注意事项
与工厂模式的区别是建造者模式更加关注与零件装配的顺序
实现 我们以一家快餐店为例
一个典型的套餐可以是一个汉堡Burger和一杯冷饮Cold drink
汉堡Burger可以是素食汉堡Veg Burger或鸡肉汉堡Chicken Burger它们是包在纸盒中 冷饮Cold drink可以是可口可乐coke或百事可乐pepsi它们是装在瓶子中
创建一个表示食物条目比如汉堡和冷饮的 Item 接口和实现 Item 接口的实体类 以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类汉堡是包在纸盒中冷饮是装在瓶子中
然后创建一个Meal类带有 Item 的 ArrayList 和一个通过结合 Item 来创建不同类型的 Meal 对象的 MealBuilder
最后使用 MealBuilder 来创建一个 Meal
范例
1. 创建一个表示食物条目和食物包装的接口.
Item.java
package com.demo.gof;
public interface Item {public String name();public Packing packing();public float price();
}Packing.java
package com.demo.gof;
public interface Packing {public String pack();
}2. 创建实现 Packing 接口的实体类
Wrapper.java
package com.demo.gof;
public class Wrapper implements Packing {Overridepublic String pack() {return Wrapper;}
}Bottle.java
package com.demo.gof;
public class Bottle implements Packing {Overridepublic String pack() {return Bottle;}
}3. 创建实现 Item 接口的抽象类该类提供了默认的功能
Burger.java
package com.demo.gof;
public abstract class Burger implements Item {Overridepublic Packing packing() {return new Wrapper();}Overridepublic abstract float price();
}
ColdDrink.java
package com.demo.gof;
public abstract class ColdDrink implements Item {Overridepublic Packing packing() {return new Bottle();}Overridepublic abstract float price();
}4. 创建扩展了 Burger 和 ColdDrink 的实体类
VegBurger.java
package com.demo.gof;
public class VegBurger extends Burger {Overridepublic float price() {return 25.0f;}Overridepublic String name() {return Veg Burger;}
}ChickenBurger.java
package com.demo.gof;
public class ChickenBurger extends Burger {Overridepublic float price() {return 50.5f;}Overridepublic String name() {return Chicken Burger;}
}Coke.java
package com.demo.gof;
public class Coke extends ColdDrink {Overridepublic float price() {return 30.0f;}Overridepublic String name() {return Coke;}
}Pepsi.java
package com.demo.gof;
public class Pepsi extends ColdDrink {Overridepublic float price() {return 35.0f;}Overridepublic String name() {return Pepsi;}
}5. 创建一个 Meal 类带有上面定义的 Item 对象
Meal.java
package com.demo.gof;
import java.util.ArrayList;
import java.util.List;public class Meal {private ListItem items new ArrayListItem(); 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().pack());System.out.println(, Price : item.price());} }
}6. 创建一个 MealBuilder 类实际的 builder 类负责创建 Meal 对象
MealBuilder
package com.demo.gof;
public class MealBuilder {public Meal prepareVegMeal (){Meal meal new Meal();meal.addItem(new VegBurger());meal.addItem(new Coke());return meal;} public Meal prepareNonVegMeal (){Meal meal new Meal();meal.addItem(new ChickenBurger());meal.addItem(new Pepsi());return meal;}
}7. BuiderPatternDemo 使用 MealBuider 来演示建造者模式Builder Pattern
BuilderPatternDemo.java
package com.demo.gof;
public class BuilderPatternDemo {public static void main(String[] args) {MealBuilder mealBuilder new MealBuilder();Meal vegMeal mealBuilder.prepareVegMeal();System.out.println(Veg Meal);vegMeal.showItems();System.out.println(Total Cost: vegMeal.getCost());Meal nonVegMeal mealBuilder.prepareNonVegMeal();System.out.println(\n\nNon-Veg Meal);nonVegMeal.showItems();System.out.println(Total Cost: nonVegMeal.getCost());}
}编译运行以上 Java 范例输出结果如下
$ javac -d . src/main/com.demo/gof/BuilderPatternDemo.java
$ java com.demo.gof.BuilderPatternDemo
Veg Meal
Item : Veg Burger, Packing : Wrapper, Price : 25.0
Item : Coke, Packing : Bottle, Price : 30.0
Total Cost: 55.0
Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.5