zoukankan      html  css  js  c++  java
  • 2018.3.31 设计模式之生成器模式详解及例子(对象创建型模式)

    设计模式之生成器模式(对象创建型模式)

    1.定义/概念

    将一个复杂对象的创建和它的表示分离,使得同样的创建过程可以有不同的表示。
    

    2.生成模式角色

    Builder:                 生成器接口,定义创建一个Product对象所需要的各个部件的操作。
    ConcreteBuilder:    具体的生成器实现,实现各个部件的创建,并负责组装Product对象的各个部件,同时还提供一个让用户获取组装完成后的产品对象的方法。
    Director:               指导者,也被称导向者,主要用来使用Builder接口,以一个统一的过程来构建所需要的Product对象。
    Product:                产品,表示被生成器构建的复杂对象,包含多个部件。
    

    3.应用场景:一水杯工厂要生产各式各样的水杯,无论杯子是神马造型,但都包括绳子,帽子和杯体。以此模型创建各种类型的杯子。

    Builder.java

    package com.glut.demo6;
    
    /**
     * Builder类
     * 生成器接口,定义创建一个Product对象所需要的各个部件的操作。
     * @author qichunlin
     *
     */
    public abstract class Builder {
    	//创建一个杯子   原来这里是设为protected类型的
    	Cup cup = new Cup();
    	//建立杯子模型
    	public abstract void buildString();//创建一个绳子部件
    	public abstract void buildCap();//创建一个帽子部件
    	public abstract void buildCupBody();//创建一个杯体部件
    	
    	//返回一个杯子对象
    	public Cup getResult() {
    		return cup;
    	}
    }
    
    

    ClassCup.java

    package com.glut.demo6;
    
    /**
     * 
     * 具体建造者 ConcreteBuilder
     * @author qichunlin
     *
     */
    public class ClassCup extends Builder{
    
    	@Override
    	public void buildString() {
    		cup.setString("生产绳子");
    		System.out.println("生产绳子....");
    	}
    
    	@Override
    	public void buildCap() {
    		cup.setCap("生产帽子");
    		System.out.println("生产帽子....");
    	}
    
    	@Override
    	public void buildCupBody() {
    		cup.setCupbody("生产杯体");
    		System.out.println("生产杯体....");
    	}
    	
    }
    
    

    Cup.java

    package com.glut.demo6;
    
    /**
     * 杯子类
     * 
     * @author qichunlin
     *
     */
    public class Cup {
    	private String string;//绳子
    	private String cap;//帽子
    	private String cupbody;//杯体
    	public String getString() {
    		return string;
    	}
    	public void setString(String string) {
    		this.string = string;
    	}
    	public String getCap() {
    		return cap;
    	}
    	public void setCap(String cap) {
    		this.cap = cap;
    	}
    	public String getCupbody() {
    		return cupbody;
    	}
    	public void setCupbody(String cupbody) {
    		this.cupbody = cupbody;
    	}
    	
    	//显示
    	public void show() {
    		System.out.println("杯子生产完毕!");
    	}
    	
    }
    
    

    Director.java

    package com.glut.demo6;
    
    /**
     * 导演类
     * 
     * @author qichunlin
     *
     */
    public class Director {
    	private Builder builder;
    	
    	public Director(Builder builder) {
    		this.builder = builder;
    	}
    	
    	//获取产品
    	public void create() {
    		builder.buildString();
    		builder.buildCap();
    		builder.buildCupBody();
    		builder.getResult().show();
    	}
    	
    	
    }
    
    

    Test.java

    package com.glut.demo6;
    
    /**
     * 生成器模式
     * 
     * 定义:将一个复杂对象的创建和它的表示分离,使得同样的创建过程可以有不同的表示。
     * @author qichunlin
     *
     */
    public class Test {
    	public static void main(String[] args) {
    		//创建具体建造者
    		ClassCup cc = new ClassCup();
    		//创建指挥者
    		Director d = new Director(cc);
                    d.create();
    	}
    }
    
    

    4.生成器模式与工厂模式的不同

    生成器模式构建对象的时候,对象通常构建的过程中需要多个步骤,就像我们例子中的先有主机,再有显示屏,再有鼠标等等,生成器模式的作用就是将这些复杂的构建过程封装起来。
    工厂模式构建对象的时候通常就只有一个步骤,调用一个工厂方法就可以生成一个对象。
    

    5.生成器模式的优缺点

    优点

    将一个对象分解为各个组件
    将对象组件的构造封装起来
    可以控制整个对象的生成过程
    

    缺点

    对不同类型的对象需要实现不同的具体构造器的类,这可能回答大大增加类的数量
    

    6.生成器模式的功能

    生成器模式的主要功能是构建复杂的产品,而且是细化的,分步骤的构建产品,也就是生成器模式重在一步一步解决构造复杂对象的问题。如果仅仅这么认知生成器模式的功能是不够的。
    更为重要的是,这个构建的过程是统一的、固定不变的,变化的部分放到生成器部分了,只要配置不同的生成器,那么同样的构建过程,就能构建出不同的产品来。

  • 相关阅读:
    初识Ubuntu 18.04(更换系统头像,截图,sy)
    HDU
    HDU
    进度1
    开课博客
    返回一个整数数组中最大子数组的和
    开学第一节课测试感受
    网页记账本开发四(基本完成)
    网页记账本开发三
    网页记账本开发二
  • 原文地址:https://www.cnblogs.com/qichunlin/p/8680072.html
Copyright © 2011-2022 走看看