Java~设计模式之建造者模式||零件装配大师

it2024-07-17  39

文章目录

建造者模式举例实现

建造者模式

建造者模式就是使用多个简单的对象, 一步一步建造合成, 零件加工, 最后成为一个满足需求的成品就好比我们需要一个工厂首先加工出来的是螺丝和钢板, 最后将这个螺丝和钢板进行进一步的加工合成一个板凳, 这个过程就是一个建造者的模式, 将简单的对象, 一步一步加工合成一个满足需求的成品主要解决: 主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。优点: 建造者是独立的, 解耦合, 易扩展, 便于控制细节缺点: 产品必须有共同点(也就是有相同的零件), 如果内部变更, 会牵连到很多对象的修改(比如修改零件, 成品肯定都需要更改)

举例实现

当我们去一家肯德基店的时候, 菜单显示主食有蔬菜汉堡(vegBurger)和鸡肉汉堡(chiBurger), 饮品有可乐(Coke)和百事(Pepsi), 汉堡系列都是纸质包装(wrapper), 饮品系列都是瓶子包装(bottle), 而且他们都还有共同点都有名字(name)和价格(price), 最后我们发现还有蔬菜套餐蔬菜汉堡和可乐, 鸡肉套餐鸡肉汉堡和百事, 下面我用一个图展示零件和成品 //实现包装的统一接口 public interface Packing { public String pack(); } //实现纸质包装的实体类 public class Wrapper implements Packing { @Override public String pack() { return "Wrapper"; } } //实现瓶子包装的实体类 public class Bottle implements Packing { @Override public String pack() { return "Bottle"; } } //实现每一个物品的条目 public interface Item { public String name(); public Packing pack(); public float price(); } //实现drink的抽象类, 表示drink所具有的功能 public abstract class Drink implements Item { @Override public abstract String name(); @Override public Packing pack() { //drink使用的是bottle包装 return new Bottle(); } @Override public abstract float price(); } //创建Burger的抽象类, 用于实现Burger需要的功能 public abstract class Burger implements Item { @Override public abstract String name(); @Override public Packing pack() { //Burger使用的是纸质包装 return new Wrapper(); } @Override public abstract float price(); } //汉堡的一个实体类, 表示一个素汉堡 public class VegBurger extends Burger { @Override public String name() { return "VerBurger"; } @Override public float price() { return (float) 13.14; } } //汉堡的实体类, 表示一个鸡肉汉堡 public class ChiBurger extends Burger { @Override public String name() { return "ChiBurger"; } @Override public float price() { return (float)52.50; } } //drink的实体类, 表示Pepsi这个实体饮品 public class Pepsi extends Drink { @Override public String name() { return "Pepsi Drink"; } @Override public float price() { return (float)2.99; } } //drink的实体类, 表示cock这个饮品 public class Cock extends Drink { @Override public String name() { return "Cock Drink"; } @Override public float price() { return (float)3.21; } } //菜单的接口, 用于表示菜单具有的功能 public interface Meal { public void addItem(Item item); public float getCost(); public void showItem(); } //表示一个菜单模板 public class MealModel implements Meal{ private List<Item> items = new ArrayList<>(); @Override public void addItem(Item item) { this.items.add(item); } @Override public float getCost() { float ret = 0; for (Item item: items ) { ret += item.price(); } return ret; } @Override public void showItem() { for (Item item : items ) { System.out.println(item.name() + ", " + item.pack().pack() + ", " + item.price()); } } } //菜单的展示 public class Store { //构建一个蔬菜菜单 public Meal getVegMeal() { Meal meal = new MealModel(); meal.addItem(new VegBurger()); meal.addItem(new Cock()); return meal; } //构建一个鸡肉菜单 public Meal getChiMeal() { Meal meal = new MealModel(); meal.addItem(new ChiBurger()); meal.addItem(new Pepsi()); return meal; } } public class Demo { public static void main(String[] args) { Store store = new Store(); //得到一个蔬菜菜单 Meal vegMeal = store.getVegMeal(); //展示vegMeal System.out.println("show vegMeal"); vegMeal.showItem(); System.out.println("总价: " + vegMeal.getCost()); System.out.println(); //得到一个鸡肉菜单 Meal chiMeal = store.getChiMeal(); System.out.println("show chiMeal"); chiMeal.showItem(); System.out.println("总价: " + chiMeal.getCost()); } }

最新回复(0)