• 建造者模式


    建造者模式:

    一个Builder类一步一步构造最终对象,该Builder类是独立于其他对象的。

    介绍

    意图:

    将一个复杂的构建与其表示相分离,使不同的构建过程可以创建不同的表示。

    何时使用:

    • 一些基本的组件不变,组合经常改变

    关键代码:

    • 建造者:创建和提供实例
    • 导演:管理创建出来实例的关系

    优点:

    • 建造者独立,易于扩展。
    • 便于控制细节风险。

    缺点:
    1、产品必须有相同点,范围有限制
    2、如果产品内部变化复杂,会有很多的构建类
    还可在拆分(监工 抽象工厂)

    使用

    // 工厂
    package cn.domin.design.builder;
    
    import cn.domin.design.builder.food.ChickenBurger;
    import cn.domin.design.builder.food.Item;
    import cn.domin.design.builder.food.VegBurger;
    
    /**
     * 建造工厂
     * @author 98543
     */
    public class BuilderFactory {
    
    	
    	/**
    	 * 套餐一
    	 * @return
    	 */
    	public static Meau getMealOne() {
    		Meau meau = new Meau();
    		Item item = new VegBurger();
    		meau.addItem(item);
    		return meau;
    	}
    	
    	/**
    	 * 套餐二
    	 * @return
    	 */
    	public static Meau getMealTwo() {
    		Meau meau = new Meau();
    		Item item = new ChickenBurger();
    		meau.addItem(item);
    		return meau;
    	}
    }
    // 菜单
    package cn.domin.design.builder;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import cn.domin.design.builder.food.Item;
    
    public class Meau {
    	
    	private List<Item> foods = new ArrayList<Item>();
    	
    	public void addItem(Item item) {
    		foods.add(item);
    	}
    	
    	public float getCoustom() {
    		float sum = 0.0f;
    		for (Item food:foods) {
    			sum += food.price();
    		}
    		return sum;
    	}
    	
    	public void getMeauInfo() {
    		for (Item food:foods) {
    			System.out.println("菜单详情:");
    			System.out.print("item -> "+food.name()+",price ->"+",packing -> "+food.packing().name());
    		}
    	}
    
    }
    
    // 食物接口
    package cn.domin.design.builder.food;
    
    import cn.domin.design.builder.packing.Packing;
    
    /**
     *     食品接口
     * @author 98543
     */
    public interface Item {
    	
    	public String name();
    	public float price();
    	public Packing packing();
    
    }
    
    // 抽象类
    package cn.domin.design.builder.food;
    
    import cn.domin.design.builder.packing.Bottle;
    import cn.domin.design.builder.packing.Packing;
    
    public abstract class Burger implements Item{
    	
    	@Override
    	public Packing packing() {
    		return new Bottle();
    	}
    
    }
    
    package cn.domin.design.builder.food;
    
    import cn.domin.design.builder.packing.Packing;
    import cn.domin.design.builder.packing.Wrapper;
    
    public abstract class ColdDrink implements Item{
    	
    	@Override
    	public Packing packing() {
    		return new Wrapper();
    	}
    
    }
    
    // 具体实现
    package cn.domin.design.builder.food;
    
    /**
     * 鸡肉汉堡
     * @author 98543
     */
    public class ChickenBurger extends Burger{
    
    	@Override
    	public String name() {
    		return "鸡肉汉堡";
    	}
    	
    	@Override
    	public float price() {
    		return 99;
    	}
    	
    }
    
    package cn.domin.design.builder.food;
    
    /**
     * 椰汁
     * @author 98543
     */
    public class Coke extends ColdDrink{
    
    	@Override
    	public String name() {
    		return "椰汁";
    	}
    	
    	@Override
    	public float price() {
    		return 10;
    	}
    }
    
    
    
  • 相关阅读:
    Eclipse maven构建springmvc项目
    [转载]Maven初级入门笔记
    NumCPU()在slice中的使用
    126短地址测试
    SVG操作插件:SVG.JS 个人提取部分实用中文文档
    sql联合查询去除重复计算总和
    计算某个月的最后一天
    JQ关于浏览器宽高的获取方式
    js不间断滚动
    DIV嵌套垂直居中
  • 原文地址:https://www.cnblogs.com/kungFuPander/p/11468351.html
Copyright © 2020-2023  润新知