建造者模式

来源:互联网 发布:linux 文件恢复 编辑:程序博客网 时间:2024/09/21 09:25

这一篇我们一起学习下建造者模式,建造者模式呢就是使用很多的比较简单的对象一步一步的组合成复杂的对象。一般这种模式应用于需要生成的对象具有复杂的内部结构或者需要生成的对象内部属性本身相互依赖。比如去肯德基买吃的,汉堡,薯条,可乐,鸡腿,这些单个的对象是不变的,但是组合在一起就会出现很多的组合,还有就是java的StringBuilder也是利用建造者模式的,有兴趣的可以去查看相关资料。

接下来我们看个小列子,就是去肯德基

步骤一:创建一个食物清单和包装的接口

  1.Item.java

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

  2.包装接口

public interface Packing {   public String pack();}
步骤二:创建包装接口的实现类

1.纸盒包装 Wrapper.java

public class Wrapper implements Packing {   @Override   public String pack() {      return "Wrapper";   }}
2.杯子包装 Bottle.java

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

在这里说明一下,后面那个类实现了Item这个接口,都是可以调用包装类的实现类


步骤三:创建实现Item接口的抽象类,并且该类提供了默认的方法

1.Burger.java汉堡类

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

2.ColdDrink冷饮类

public abstract class ColdDrink implements Item {@Overridepublic Packing packing() {       return new Bottle();}@Overridepublic abstract float price();}
· 这两个抽象类实现了Item接口,也就是说这两个抽象类在后面被继承的自雷中既可以调用该类的默认方法,也可以重写默认的方法,也可以调用实现了Packing的实现类

步骤四:创建继承了Burger和ColdDrink的子类

1.VegBurger素菜汉堡类

public class VegBurger extends Burger {   @Override   public float price() {      return 25.0f;   }   @Override   public String name() {      return "Veg Burger";   }}
2.ChickenBurger鸡肉汉堡类

public class ChickenBurger extends Burger {   @Override   public float price() {      return 50.5f;   }   @Override   public String name() {      return "Chicken Burger";   }}
3.Coke 可口可乐类

public class Coke extends ColdDrink {   @Override   public float price() {      return 30.0f;   }   @Override   public String name() {      return "Coke";   }}
4.Pepsi 百事可乐类

public class Pepsi extends ColdDrink {   @Override   public float price() {      return 35.0f;   }   @Override   public String name() {      return "Pepsi";   }}
步骤五:创建一个Meal类,带有上面定义的Item对象

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

步骤六:创建一个MealBuilder类,负责创建Meal类

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;   }}
步骤七:BuiderPatternDemo 使用 MealBuider 来演示建造者模式(Builder Pattern)。

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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩看到大人吵架就哭了 怎么办 五年级的孩子叛逆爱发脾气怎么办 6个月孩子多动怎么办呀 小孩被大人打了很生气该怎么办 小孩在学校调皮被老师打了怎么办 四岁宝宝咳嗽半个月了怎么办 三岁宝宝咳嗽半个月了还不好怎么办 孩子在幼儿园不听话天天罚站怎么办 孩子个性太强脾气太倔不听话怎么办 孩子有十七了太不听话了怎么办 小孩的学籍填错了怎么办还能改吗 生完孩子后脾气暴躁易怒怎么办 生完孩子之后变懒了怎么办呀? 孩子三年级了成绩不突出家长怎么办 自私势力的父母想把我害死怎么办 父母如果养出自私的孩子怎么办 大人得了地图舌怎么办要怎么治疗 请问我家小孩有心理儿问题怎么办 想离婚妻子拿孩子命威胁怎么办 爸妈50多岁了吵架很严重怎么办 我和别人没离婚的老婆在一起怎么办 老婆起诉我离婚我不想理怎么办 上大学的孩子对考试无所谓怎么办 家里的人对我已经没有信心了怎么办 我是做股票配资的找不到客户怎么办 心理健康类的课程总是选不了怎么办 孩子该上初三了英语基础差怎么办 初二学生辍学半年又想上学怎么办 保险用的小红本丢了怎么办 孩子的小红本丢了怎么办 宝宝打针的小红本丢了怎么办 居民养老保险小红本丢了怎么办 小学六年级素质报告单丢了怎么办 西安小学素质报告册有b怎么办 辽宁省干部在线学习时长不够怎么办 鬼火一代发动机在中间卡死怎么办 医疗权与患者隐私权想冲突怎么办 登录法宣在线出现贴号失效怎么办 黔微普法在线竞答成绩不合格怎么办 怎么办刮过胡子后又长了? 网贷暴力催收警察也没办法怎么办