版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40780805/article/details/82959386
生成器模式(Builder Pattern):分离构建算法和具体的构造实现,从而使构建算法可以重用
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。
生成器模式将对象的构造过程封装在具体的生成器中,用户使用不同的具体生成器就可以得到该对象的不同表示。
当增加新的具体的生成器是,不必修改指挥者的代码,即该模式满足开-闭原则。
角色:
- 产品类(Product)——实类,指定产品的结构或生产步骤
- 抽象生成器(Abstract Builder)——抽象类,定义子类在完成具体产品结构时必须要实现的方法
- 具体生成器(Concreat Builder)——实类,具体一种产品的实现
- 指导类(Director)——与用户直接交互的类,通过此类可以生产出不同的产品
列子:感冒药都应该具有配方,但不同药品的配方的组成成分又不相同。药品生产的结构就满足生成器模式
import java.util.ArrayList;
import java.util.List;
public class BuilderModel {
/**
* 创造者模式(生成器模式)
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
DrugDirector director=new DrugDirector();
DrugBuilder builder;
builder=new Builder999();
director.construct(builder);
builder=new BuilderGanKang();
director.construct(builder);
}
}
// 药品配方类
class Drug {
private String drugName;
public Drug(String drugName) {
this.drugName = drugName;
}
///输出药物名字
public String getDrugName() {
return drugName;
}
private List<String> list = new ArrayList<String>();
//添加药物成分
public void addSub(String dSub) {
list.add(dSub);
}
//输出药物成分
public String getSub() {
String temp ="";
for(String s:list){
temp+=(s+" ");
}
return temp;
}
}
//药品生成器接口
interface DrugBuilder{
//定义子类必须实现的两个方法(添加药物成分和显示药物成分)
public void builderSub();
public void showDrug();
}
//药品1
class Builder999 implements DrugBuilder{
Drug drug=new Drug("999感冒灵");
@Override
public void builderSub() {
drug.addSub("麻黄");
drug.addSub("葛根");
drug.addSub("桂枝");
drug.addSub("糊精");
drug.addSub("苦杏仁");
drug.addSub("陈皮");
}
@Override
public void showDrug() {
System.out.println("药品名称:"+drug.getDrugName());
System.out.println("组成成分:"+drug.getSub());
}
}
//药品2
class BuilderGanKang implements DrugBuilder{
Drug drug=new Drug("感康");
@Override
public void builderSub() {
drug.addSub("对乙酰氨基酚");
drug.addSub("盐酸金刚烷胺");
drug.addSub("咖啡因");
drug.addSub("人工牛黄");
drug.addSub("马来酸氯苯那敏");
}
@Override
public void showDrug() {
System.out.println("药品名称:"+drug.getDrugName());
System.out.println("组成成分:"+drug.getSub());
}
}
//指挥类(制定药品的种类)
class DrugDirector{
//在这里指挥类的作用只是显示药品信息,需要传入药品对象表明是何种药品的信息
public void construct(DrugBuilder builder){
builder.builderSub();
builder.showDrug();
}
}
程序输出:
药品名称:999感冒灵
组成成分:麻黄 葛根 桂枝 糊精 苦杏仁 陈皮
药品名称:感康
组成成分:对乙酰氨基酚 盐酸金刚烷胺 咖啡因 人工牛黄 马来酸氯苯那敏
参考书籍:《大话设计模式》,《设计模式(Java版)》