【张六儿大话设计模式】——建造者模式

本文通过一个生动的例子介绍了建造者模式的应用场景及其实现方式。通过为女友选购化妆品套装的过程,展示了如何利用建造者模式简化复杂对象的创建流程。

建造者模式

    张六儿本是一个钢铁直男,但是由于女朋友小西的悉心调教,耳濡目染的他渐渐的也对女生的化妆品有了许多了解。日子久了,他也能够替小西挑选化妆品了,小西只要跟张六儿说,她要一个化妆品套装包括:眼影、眉笔和口红,并且说明基本需求,张六儿就能根据需求去商店里给小西购买一套化妆品 。小西不用关心张六儿买化妆品的时候是怎样挑选、比较、试色、搭配的,只需要等着张六儿把一个化妆品套装礼盒送到她面前就好了。

    建造者模式同样是一种创建型模式,建造者模式的目的是为了构建一个内部结构较为复杂的对象。使用建造者模式时我们只需要发出相应的指令,不需要关心这个复杂的对象是如何构建而成的,只需要等待建造者将对象建造完毕就可以直接使用了。建造者模式将一个复杂的构建过程与其表示相分离,使得同样的构建过程可以创建不同的表示。

    应用场合:在一个系统中,有时一个复杂对象是由很多子对象通过一系列算法构成,各个子对象可能会由于需求的变化而面临着许多改变,但是将它们组合在一起的算法却是相对稳定的。

首先创建一个Category接口表示化妆品的类别,并创建三个类眉笔、眼影、口红分别实现这个接口

public interface Category {
	String name();
}
public class YanYing implements Category{
	@Override
	public String name() {
		return "眼影";
	}
}
public class MeiBi implements Category{
	@Override
	public String name() {
		return "眉笔";
	}
}
public class KouHong implements Category{
	@Override
	public String name() {
		return "口红";
	}
}

然后创建Item接口表示放入套装中的化妆品,创建YSL口红、香奈儿眼影、植村秀眉笔等等来实现接口

public interface Item {
	public String getName();
	public Category getCategory();
	public float getPrice();
}
public class MAC_KH implements Item{

	@Override
	public String getName() {
		return "MAC口红";
	}

	@Override
	public Category getCategory() {
		return new KouHong();
	}

	@Override
	public float getPrice() {
		return 155.0f;
	}

}
public class YSL_KH implements Item{

	@Override
	public String getName() {
		return "YSL口红";
	}

	@Override
	public Category getCategory() {
		return new KouHong();
	}

	@Override
	public float getPrice() {
		return 265.0f;
	}
	
}
public class Chanel_YY implements Item{

	@Override
	public String getName() {
		return "香奈儿眼影";
	}

	@Override
	public Category getCategory() {
		return new YanYing();
	}

	@Override
	public float getPrice() {
		return 499.0f;
	}

}
public class Dior_YY implements Item{

	@Override
	public String getName() {
		return "Dior眼影";
	}

	@Override
	public Category getCategory() {
		return new YanYing();
	}

	@Override
	public float getPrice() {
		return 599.0f;
	}
	
}
public class ETUDEHOUSE_MeiBi implements Item{

	@Override
	public String getName() {
		return "爱丽小屋眉笔";
	}

	@Override
	public Category getCategory() {
		return new MeiBi();
	}

	@Override
	public float getPrice() {
		return 30.0f;
	}
	
}
public class ShuUemura_MeiBi implements Item{

	@Override
	public String getName() {
		return "植村秀眉笔";
	}

	@Override
	public Category getCategory() {
		return new MeiBi();
	}

	@Override
	public float getPrice() {
		return 260.0f;
	}

}

接着创建一个Cosmetics类,表示包装化妆品的礼盒

public class Cosmetics {
	//用来存放化妆品对象
	private ArrayList<Item> suit = new ArrayList<Item>();
	//选购化妆品
	public void addItem(Item item) {
		suit.add(item);
	}
	//输出总价
	public void getCost() {
		float cost = 0;
		for(Item c : suit) {
			cost += c.getPrice();
		}
		System.out.println("共花费¥"+cost);
	}
	//展示化妆品
	public void showList() {
		for(Item i : suit) {
			System.out.println(i.getCategory().name()+":"+i.getName()+",价格为¥"+i.getPrice());
		}
	}
}

创建建造者也就是张六儿,负责购买化妆品并包装成套装礼盒。其中包含两个方法,分别表示两种不同的选购方案。

public class Zhang6er {
	public Cosmetics suit_1() {
		Cosmetics cos = new Cosmetics();
		cos.addItem(new Chanel_YY());
		cos.addItem(new MAC_KH());
		cos.addItem(new ETUDEHOUSE_MeiBi());
		return cos;
	}
	public Cosmetics suit_2() {
		Cosmetics cos = new Cosmetics();
		cos.addItem(new Dior_YY());
		cos.addItem(new YSL_KH());
		cos.addItem(new ShuUemura_MeiBi());
		return cos;
	}
}

运行类

public class Main {
	public static void main(String args[]) {
		Zhang6er z6 = new Zhang6er();
		Cosmetics suit1 = z6.suit_1();
		Cosmetics suit2 = z6.suit_2();
		System.out.println("张六儿购买的化妆品套装1:");
		suit1.showList();
		suit1.getCost();
		System.out.println("张六儿购买的化妆品套装2:");
		suit2.showList();
		suit2.getCost();
	}
}

运行结果:


    建造者模式简化了一些复杂对象的创建工作(选购化妆品,做成礼盒),和抽象工厂模式最大的不同是,建造者模式内部的子对象不可以单独创建,只能够创建最终的复杂对象。而抽象工厂模式中,工厂的每个方法都可以创建一个产品族下的某一个特定产品。

    优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

     缺点: 1、产品必须有共同点,范围有限制(都是化妆品礼盒)。 2、如内部变化复杂,会有很多的建造类(上述例子9个化妆品类)。


「LLM那些事」系列第 4 篇《上下文窗口的边界》,文章连接:https://blog.csdn.net/houwenjin/article/details/163999753。 演示什么:在「预测」Sheet 的黄色格子里输入一句话(默认「来泡一杯」),四个「模型」——分别只统计最后 1 / 2 / 3 / 4 个字的 n-gram 查表——同时预测下一个字。同一个输入,看的上下文越长,候选越少、预测越确定: ┌────────────────┬──────────┬───────────────┬──────┐ │ 只看最后几个字 │ 用的前缀 │ 候选下一字数 │ 预测 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 1 个 │ 杯 │ 3(茶/子/水) │ 模糊 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 2 个 │ 一杯 │ 2(茶/水) │ 收窄 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 3 个 │ 泡一杯 │ 1(茶) │ 确定 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 4 个 │ 来泡一杯 │ 1(茶) │ 确定 │ └────────────────┴──────────┴───────────────┴──────┘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值