建造者模式

建造者模式:

一个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;
    }
}

转载于:https://www.cnblogs.com/kungFuPander/p/11468351.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值