跟屌丝大哥学习设计模式---生成器模式(Builder)解析例子

简介:
生成器模式属于对象结构型模式,其意图是将一个复杂对象的构建与他的表示分离,使得同样的构建创建过程可以创建不同的表示。
适用性:
1.          当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时
2.          当构造过程必须允许被构造的对象有不同的表示时。
 
参与者:
        生成器Builder: 为创建一个Product 对象的各个部件指定抽象接口(AnimalBuilder)
        具体生成器ConcreteBuilder: 实现Builder 接口一构造和装配该产品的各个部件。
                      定义并明确他所创建的表示,
                      提供一个检索产品的接口(getAnimal)
导向器:构建一个适用Builder 对象的接口。
Product Checken,pig : 表示被构造的复杂对象。ConcreteBuilder 创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终的产品。
图1
当客户需要一个产品时,把需要的参数传递个导向器,导向器根据传递的参数调用具体的生成器,具体的生成器通过一系列的操作(getAnimal()通过调用其它的接口方法实现)最会返回一个产品。
Bridge模式的优点:
1.         它使你可以改变一个产品的内部表示,Builder对象提供给导向器一个构造产品的抽象接口,该接口使得生成器可以隐藏这个产品的表示和内部结构,他同时也隐藏了该产品是如何装配的,因为产品时通过抽象接口构造的(注:本例子把接口的实现放在具体类中了),你在改变该产品的内部表示时所要做的只是定义一个新的生成器。
2.         他将构造代码和表示代码分开,这有点类似于模板模式。所不同的是模版模式最终是完成复杂的工作,而生成器的目的是要生成一个复杂的对象。
3.         他使得你对构造过程进行更加精细的控制。Builder模式是在导向者的控制下一步一步构造产品的,仅当该产品完成时,导向者才从生成器中取回产品。因此Builder模式能更好的反映产品的构造过程,使你可以更精细的控制构建过程,从而能更精细的控制所的产品的内部结构。
代码示例:
AnimalBuilder:代码
package  builder;
public  interface  AnimalBuilder{
     public  void  buildName();
     public  void  buildLegs();
     public  void  buildMeat();
     public  Animal getAnimal();
}
ChickenBuilder 代码:
package  builder;
public  class  ChickenBuilder  implements  AnimalBuilder{
     private  Animal  chicken  =  null ;
     public  ChickenBuilder(){
        chicken  =  new  Animal();
    }
     public  void  buildName(){
        chicken .setName( "chicken" );
    }
     public  void  buildLegs(){
        chicken .setLegs(2);
    }
     public  void  buildMeat(){
        chicken .setMeat( "chicken" );
    }
     public  Animal getAnimal(){
       buildName();
       buildLegs();
       buildMeat();
        return  chicken ;
    }
}
Animal代码:
package  builder;
public  class  Animal{
     private  String  name ;
     private  String  meat ;
     private  int  legs ;
     public  String getName(){
        return  name ;
    }
     public  String getMeat(){
        return  meat ;
    }
     public  int  getLegs(){
        return  legs ;
    }
     public  void  setName(String aName){
        name  = aName;
    }
     public  void  setMeat(String aMeat){
        meat  = aMeat;
    }
     public  void  setLegs( int  alegs){
        legs  = alegs;
    }
}
Director代码:
package  builder;
public  class  Director{
     public  Animal getAnimal(String aName){
        if (aName.equals( "chicken" )){
            return  new  ChickenBuilder().getAnimal();
       }
        else  if (aName.equals( "pig" )){
            return  new  PigBuilder().getAnimal();
       }
        else  return  null ;
    }
}
 
客户端代码:
package  builder;
public  class  Client{
     public  static  void  description(Animal animal){
       String desc =  "This animal is called " +animal.getName();
       desc += "\n Its meat is " +animal.getMeat();
       desc += "\n And it has " +animal.getLegs()+ " legs." ;
       System. out .println(desc);
    }
     public  static  void  main(String[] args){
       String aName =  "chicken" ;
       Director d =  new  Director();
       Animal animal =d.getAnimal(aName);
       description(animal);
       aName =  "pig" ;
       animal = d. getAnimal (aName);
       description(animal);
    }
}
结论:生成器模式使得客户可以更加精细的控制一个对象的构建,每个具体的创建者包含了创建和装配一个特定产品的所有代码,这些代码只用写一次,便可以被不同的Director使用,从而可以装配出不同的对象。
 








====================================分割线================================



最新内容请见作者的GitHub页:http://qaseven.github.io/

目录
相关文章
|
22天前
|
域名解析 移动开发 负载均衡
阿里云DNS常见问题之DNS负载均衡调加权模式失败如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
|
2月前
|
监控 API 开发者
Sentinel之道:流控模式解析与深度探讨
Sentinel之道:流控模式解析与深度探讨
48 0
|
3月前
|
存储 安全 JavaScript
【分布式技术专题】「授权认证体系」深度解析OAuth2.0协议的原理和流程框架实现指南(授权流程和模式)
在传统的客户端-服务器身份验证模式中,客户端请求服务器上访问受限的资源(受保护的资源)时,需要使用资源所有者的凭据在服务器上进行身份验证。资源所有者为了给第三方应用提供受限资源的访问权限,需要与第三方共享它的凭据。这就导致一些问题和局限:
372 2
【分布式技术专题】「授权认证体系」深度解析OAuth2.0协议的原理和流程框架实现指南(授权流程和模式)
|
3月前
|
数据处理 Python
Python学习:迭代器与生成器的深入解析
Python学习:迭代器与生成器的深入解析
21 0
|
4月前
|
域名解析 缓存 网络协议
dpdk课程学习之练习笔记四(dns预备)
dpdk课程学习之练习笔记四(dns预备)
32 0
|
8天前
|
存储 安全 测试技术
网络奇谭:虚拟机中的共享、桥接与Host-Only模式解析
网络奇谭:虚拟机中的共享、桥接与Host-Only模式解析
15 0
|
25天前
|
算法 安全 程序员
【C++ 随机数生成器】深入解析C++ 随机数生成器mersenne_twister_engine等
【C++ 随机数生成器】深入解析C++ 随机数生成器mersenne_twister_engine等
72 0
|
1月前
|
XML 存储 JavaScript
深入学习 XML 解析器及 DOM 操作技术
所有主要的浏览器都内置了一个XML解析器,用于访问和操作XML XML 解析器 在访问XML文档之前,必须将其加载到XML DOM对象中 所有现代浏览器都有一个内置的XML解析器,可以将文本转换为XML DOM对象
72 0
|
1月前
|
存储 安全 区块链
NFT代币模式系统开发技术规则解析
随着区块链技术的飞速发展,NFT(非同质化代币)作为一种独特的数字资产,正在全球范围内掀起一股热潮。NFT不仅赋予了数字内容独一无二的身份标识,更让艺术品、游戏道具等虚拟物品具备了真实可交易的价值。本文将深入探讨NFT代币模式的系统开发源码,带您领略这一创新技术的魅力所在。
|
1月前
|
域名解析 缓存 网络协议
HTTP DNS的工作模式
【2月更文挑战第12天】
HTTP DNS的工作模式

推荐镜像

更多