1. 生成器模式
    生成器模式是一种对象的创建模式,可以将一个复杂产品的内部表象和产品的生产过程分隔开来,(构建与表示分离)。使得同样的构建过程可以创建不同的表示。
    简单的来说,就是讲一个复杂的对象拆分成一个一个小的对象,然后通过排列组合的方式生成不同的复杂对象。举个栗子:例如快餐店的套餐,会有个定价,比如说总价是20元套餐。可以有两素菜一个荤菜。素菜包括清炒白菜、土豆丝、麻婆豆腐等等,荤菜包括口水鸡,啤酒鸭,小炒肉等等。这样只要是两素菜一荤菜组合,就能形成一个个套餐。这其实就类似于生成器模式。这里的复杂产品是套餐,而生产过程则是一个一个的小菜。
  2. 生成器模式示意图

    3.生成器模式所含角色
  • 产品角色: 产品是要构建的复杂对象。
  • 抽象建造者角色: 为创建产品角色对象的各个部分指定抽象接口,一般至少包含有两个方法,一个是建造产品,一个是返回产品。
  • 具体建造者角色: 实现抽象建造者角色。并且根据不同的情形对于产品创建给出具体的方法。并且能够在创建完成后返回产品实例。
  • 导演角色: 构造一个能够使用抽象建造者的对象。该角色不涉及具体的产品信息。主要负责和客户端打交道。
  1. 示例代码:
    场景:某旅游网站推出了3日游和4日游的业务。需要设计一个度假计划生成的项目。
    产品角色:
public class Vacation {private Date date;private ArrayList<VacationDay> vacationDays=null;private int days = 0;private VacationDay vacationDay;public Vacation(String dt) {vacationDays = new ArrayList<VacationDay>();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {date = sdf.parse(dt);vacationDay = new VacationDay(date);vacationDays.add(vacationDay);days++;} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void setDate(String dt){SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {date = sdf.parse(dt);} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public Date getDate() {return date;}/*** 获取下一天* @param n* @return*/private Date nextDate(int n){Calendar cal = Calendar.getInstance();cal.setTime(date);cal.add(Calendar.DATE, n);return cal.getTime();}/*** 假期中的下一天*/public void addDay(){vacationDay = new VacationDay(nextDate(days));vacationDays.add(vacationDay);days++;}public boolean setVacationDay(int i){if ((i > 0) && (i < vacationDays.size())) {vacationDay = vacationDays.get(i);return true;}vacationDay = null;return false;}public void setHotel(String hotel){vacationDay.setHotel(hotel);}public void setEvent(String event){vacationDay.addEvents(event);}public void setTicket(String ticket){vacationDay.addtickets(ticket);}public void showInfo() {for (int i = 0, len = vacationDays.size(); i < len; i++) {System.out.println("** " + (i + 1) + " day**");System.out.println(vacationDays.get(i).toString());}}
}

假期中的每天用一个具体类标示:

public class VacationDay {private Date date;private String hotel;private ArrayList<String> events;private ArrayList<String> tickets;public VacationDay(Date dt) {date = dt;events = new ArrayList<String>();tickets = new ArrayList<String>();}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public String getHotel() {return hotel;}public void setHotel(String hotel) {this.hotel = hotel;}public void addEvents(String event){events.add(event);}public void addtickets(String ticket){tickets.add(ticket);}@Overridepublic String toString() {return date + "VacationDay>>>>" +"date=" + date +", hotel='" + hotel + '\'' +", events=" + events +", tickets=" + tickets ;}
}

抽象建造者角色:

public interface Builder {void buildvacation();void buildDay(int i);void addHotel(String hotel);void addTicket(String ticket);void addEvent(String event);Vacation getVacation();
}

具体建造者角色:

public class FourDaysBuilder implements Builder {private Vacation vacation;public FourDaysBuilder(String date) {vacation = new Vacation(date);}/*** 创建完整的假期的方法*/@Overridepublic void buildvacation() {addTicket("机票");addHotel("如家");addEvent("住宿");addEvent("晚餐");vacation.addDay();;addTicket("公园门票");addEvent("游城市公园");addTicket("水族馆门票");addEvent("游水族馆");addHotel("希尔顿酒店");vacation.addDay();addEvent("中央公园");addTicket("观光bus");addHotel("万达酒店");vacation.addDay();addTicket("机票");addEvent("回家");}@Overridepublic void buildDay(int i) {vacation.setVacationDay(i);}@Overridepublic void addHotel(String hotel) {vacation.setHotel(hotel);}@Overridepublic void addTicket(String ticket) {vacation.setTicket(ticket);}@Overridepublic void addEvent(String event) {vacation.setEvent(event);}@Overridepublic Vacation getVacation() {return vacation;}
}

导演角色:

public class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}public void setBuilder(Builder builder) {this.builder = builder;}public void construct(){builder.buildvacation();builder.getVacation().showInfo();}
}

测试主函数:

public class Main {public static void main(String[] args) {Director director = new Director(new FourDaysBuilder("2019-01-30"));director.construct();}
}
  1. 生成器模式的总结:
    从上面的实例代码看出,生成器模式的有点是建造者是独立的,便于扩展。但是缺点也很明显如果内部系统较为复杂就会有很多的建造类。生成器模式的使用是系统中的子系统具有相互的联系。

JAVA23种设计模式之生成器模式相关推荐

  1. 二十三种设计模式[3] - 生成器模式(Builder Pattern)

    前言 生成器,又名建造者模式,属于创建型模式.在<设计模式 - 可复用的面向对象软件>一书中对它的描述为" 将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表 ...

  2. Java23种设计模式之工厂模式

    工厂模式 前言 一.简单工厂模式 二.工厂方法模式 优点: 缺点: 三.工厂方法模式适合应用场景 总结 前言 核心本质: 1.实例化对象不使用new,用工厂方法代替, 2.将选择实现类,创建对象统一管 ...

  3. Java--23种设计模式之decorator模式

    装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性.动态给一个对象增加功能,这些功能可以再动态的撤消.增加由一些基本功能的排列组合而产生的非常大量的 ...

  4. Java23种设计模式之-----访问者模式

    一.什么是访问者模式? Visitor模式也叫做访问者模式,是行为模式之一,它分离对象的数据和行为,使用Visitor模式,可以不修改已有类的情况下,增加新的操作. 二.访问者模式的应用实例 比如有一 ...

  5. java23种设计模式之五:代理模式

    一.代理模式介绍 代理模式的定义:就是为一个接品(对象)提供一个代理的对象,并由这个代理对象控制对原对象的访问流程 其中代理又分为:静态代理和动态代理 静态代理:指的是自己要写一个代理类,或者用工具生 ...

  6. 走穿java23种设计模式-15责任链模式详解

    走穿java23种设计模式-15责任链模式详解 责任链模式是一种常见的行为模式. 一.责任链模式的现实场景 习伟过生日邀请了很多朋友到KTV一起庆祝,为了增加欢乐的气氛,习伟建议大家一起玩击鼓传花的游 ...

  7. JAVA23种设计模式(2)-结构型模式7种

    JAVA23种设计模式(2)-结构型模式7种 把类结合在一起形成更大的结构 适配器模式(adapter) 一句话:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容 这是平时比较常见的一种模 ...

  8. 走穿java23种设计模式--18中介者模式详解

    走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...

  9. JAVA23种设计模式学习,源码+案例分析+类图讲解

    本文对JAVA中23种设计模式进行了简单的讲解,幷加以实际案例进行辅助理解,每种模式都会举例说明,幷将源码开源至gitee和githbu上.JAVA目录下为源码,resources目录下的UML文件夹 ...

最新文章

  1. px,em, rem的区别,在项目中怎么使用rem.
  2. 调用iframe中的函数
  3. python主线程执行_在Django vi中的主线程中执行Python函数
  4. 哈希存储 java_Java容器系列之HashMap的存储
  5. java8 lambda map排序_Java8新特性第3章(Stream API)
  6. 【Recat 应用】之 React 脚手架
  7. linux内核disabled,Linux内核关闭IPv6协议的方式
  8. 11.8 自动化测试脚本编写规范(1)
  9. win10高危服务_IPv6用户危险了!Win10出现严重安全漏洞
  10. python dll load fail_python报错DLL load failed:找不到模块怎么解决?
  11. 浅析Windows计算机中丢失SETUPAPI.dll的问题
  12. 音频音量控制工具SoundSource 5 for Mac
  13. linux chmod -r,linux chmod -R 777 / 的危害
  14. oracle mysql认证考试流程_oraclemysql认证的考试流程有哪些
  15. 三星复印机载体初始化步骤_三星复印机的使用方法
  16. 怎么用photoshop抠图,得到透明图片,填充颜色,得到一个程序透明图标
  17. python 日历热力图_pyecharts日历热力图
  18. rdesktop参数
  19. 效用最大化问题中的三个函数——需求函数、间接效用函数、支出函数
  20. QCC514x-QCC304x(headset)系列(实战篇)之3.2 如何使用按键开机和关机

热门文章

  1. el-table-column根据条件修改字体颜色,el-table-column序号展示
  2. java枚举类型多属性的应用
  3. 全国交通安全日|闪马智能入选“2021上海市交通文明公益联盟”合作单位
  4. StackOverFlow 最有影响力的IT书箱 [Share]
  5. java生成字节码文件_java源程序经编译生成的字节码文件的拓展名为
  6. 使用非Android系统的其他字体
  7. Winforms:只读TextBox的文字颜色不随ForeColor的改变而改变
  8. MIPI D-PHY介绍
  9. 隔直网络(无源RC高通滤波)中电容充放电时间对信号处理及测量(以检波为例)的影响分析
  10. 51c语言用数码管写时钟,LED数码管时钟程序+电路-时间可调