zoukankan      html  css  js  c++  java
  • 建造者模式

    在软件开发中,也会存在一些构造非常复杂的对象,这些对象拥有一系列的成员属性,这些成员属性有些是基本数据类型,有些是引用类型,总之就是一句话,这个对象的构建比较复杂。在这里我们就将复杂对象当做汽车,成员属性当做部件,对象的构建当做汽车的组合。对于用户而言我们总是希望我们在使用对象时足够简单,如果一个复杂的对象直接丢给用户,用户会是痛苦不堪的(给你一堆部件,你来组装成一辆汽车看看),除了这个构建的过程外,可能用户会忘记某些成员属性。所以我们就希望能够像使用汽车一样使用复杂的对象:直接告诉你我需要的对象名或者对象类型,你返回一个完成的对象实例给我。建造者返回给客户一个完整的的产品对象,而客户端无须关心该对象所包含的额属性和组建方式,这就是建造者模式的设计动机。

    代码1:产品

    public class Meal {
        private String food;
        private String drink;
    
        public String getFood() {
            return food;
        }
    
        public void setFood(String food) {
            this.food = food;
        }
    
        public String getDrink() {
            return drink;
        }
    
        public void setDrink(String drink) {
            this.drink = drink;
        }
    }
    

    代码2:建造者

    public abstract class MealBuilder {
        Meal meal = new Meal();
        
        public abstract void buildFood();
        
        public abstract void buildDrink();
        
        public Meal getMeal(){
            return meal;
        }
    }
    
    public class MealA extends MealBuilder{
    
        public void buildDrink() {
            meal.setDrink("一杯可乐");
        }
    
        public void buildFood() {
            meal.setFood("一盒薯条");
        }
    
    }
    
    public class MealB extends MealBuilder{
    
        public void buildDrink() {
            meal.setDrink("一杯柠檬果汁");
        }
    
        public void buildFood() {
            meal.setFood("三个鸡翅");
        }
    
    }
    

    代码3:指挥官

    public class KFCWaiter {
        private MealBuilder mealBuilder;
        
        public void setMealBuilder(MealBuilder mealBuilder) {
            this.mealBuilder = mealBuilder;
        }
    
        public Meal construct(){
            //准备食物
            mealBuilder.buildFood();
            //准备饮料
            mealBuilder.buildDrink();
            
            //准备完毕,返回一个完整的套餐给客户
            return mealBuilder.getMeal();
        }
    }
    

    代码4:客户端代码

    public class Client {
        public static void main(String[] args) {
            //服务员
            KFCWaiter waiter = new KFCWaiter();
            //套餐A
            MealA a = new MealA();
            //服务员准备套餐A
            waiter.setMealBuilder(a);
            //获得套餐
            Meal mealA = waiter.construct();
            
            System.out.print("套餐A的组成部分:");
            System.out.println(mealA.getFood()+"---"+mealA.getDrink());
        }
    }
    

      

  • 相关阅读:
    Working with macro signatures
    Reset and Clear Recent Items and Frequent Places in Windows 10
    git分支演示
    The current .NET SDK does not support targeting .NET Core 2.1. Either target .NET Core 2.0 or lower, or use a version of the .NET SDK that supports .NET Core 2.1.
    Build website project by roslyn through devenv.com
    Configure environment variables for different tools in jenkins
    NUnit Console Command Line
    Code Coverage and Unit Test in SonarQube
    头脑王者 物理化学生物
    头脑王者 常识,饮食
  • 原文地址:https://www.cnblogs.com/wuMing-dj/p/3359140.html
Copyright © 2011-2022 走看看