制作者形式

制作者形式(Builder Pattern)利用多个简略的东西一步一步构建成一个庞杂的东西。这类范例的设想形式属于建立型形式,它供给了一种建立东西的最好体例。

一个 Builder 类会一步一步机关终究的东西。该 Builder 类是自力于其余东西的。

先容

企图:将一个庞杂的构建与其表现相分手,使得一样的构建进程能够建立差别的表现。

首要处理:首要处理在软件体系中,偶然候面对着"一个庞杂东西"的建立任务,其凡是由各个局部的子东西用必然的算法组成;因为须要的变更,这个庞杂东西的各个局部常常面对着猛烈的变更,可是将它们组合在一路的算法却绝对稳定。

什么时辰利用:一些根基部件不会变,而其组合常常变更的时辰。

若何处理:将变与稳定分手开。

关头代码:制作者:建立和供给实例,导演:办理制作出来的实例的依靠干系。

利用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是稳定的,而其组合是常常变更的,天生出所谓的"套餐"。 2、JAVA 中的 StringBuilder。

长处: 1、制作者自力,易扩大。 2、便于节制细节危险。

错误谬误: 1、产物必须有配合点,规模有限定。 2、如外部变更庞杂,会有良多的制作类。

利用场景: 1、须要天生的东西具备庞杂的外部布局。 2、须要天生的东西外部属性自身彼此依靠。

注重事变:与工场形式的区分是:制作者形式加倍存眷与整机拆卸的挨次。

完成

咱们假定一个快餐店的贸易案例,此中,一个典范的套餐能够是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)能够是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)能够是适口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。

咱们将建立一个表现食品条款(比方汉堡和冷饮)的 Item 接口和完成 Item 接口的实体类,和一个表现食品包装的 Packing 接口和完成 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。

而后咱们建立一个 Meal 类,带有 ItemArrayList 和一个经由过程连系 Item 来建立差别范例的 Meal 东西的 MealBuilderBuilderPatternDemo,咱们的演示类利用 MealBuilder 来建立一个 Meal

制作者形式的 UML 图

步骤 1

建立一个表现食品条款和食品包装的接口。

Item.java

public interface Item { public String name(); public Packing packing(); public float price(); }

Packing.java

public interface Packing { public String pack(); }

步骤 2

建立完成 Packing 接口的实体类。

Wrapper.java

public class Wrapper implements Packing { @Override public String pack() { return "Wrapper"; } }

Bottle.java

public class Bottle implements Packing { @Override public String pack() { return "Bottle"; } }

步骤 3

建立完成 Item 接口的笼统类,该类供给了默许的功效。

Burger.java

public abstract class Burger implements Item { @Override public Packing packing() { return new Wrapper(); } @Override public abstract float price(); }

ColdDrink.java

public abstract class ColdDrink implements Item { @Override public Packing packing() { return new Bottle(); } @Override public abstract float price(); }

步骤 4

建立扩大了 Burger 和 ColdDrink 的实体类。

VegBurger.java

public class VegBurger extends Burger { @Override public float price() { return 25.0f; } @Override public String name() { return "Veg Burger"; } }

ChickenBurger.java

public class ChickenBurger extends Burger { @Override public float price() { return 50.5f; } @Override public String name() { return "Chicken Burger"; } }

Coke.java

public class Coke extends ColdDrink { @Override public float price() { return 30.0f; } @Override public String name() { return "Coke"; } }

Pepsi.java

public class Pepsi extends ColdDrink { @Override public float price() { return 35.0f; } @Override public String name() { return "Pepsi"; } }

步骤 5

建立一个 Meal 类,带有下面界说的 Item 东西。

Meal.java

import java.util.ArrayList; import java.util.List; public class Meal { 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().pack()); System.out.println(", Price : "+item.price()); } } }

步骤 6

建立一个 MealBuilder 类,现实的 builder 类担任建立 Meal 东西。

MealBuilder.java

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

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()); } }

步骤 8

履路法式,输入成果:

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

相干文章