码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式五:建造者模式

时间:2015-05-12 18:59:12      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:设计模式

建造者模式又称为生成器模式,它是一种较为复杂、使用频率也相对较低的创建型模式。建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品。

建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。

//Actor角色类:复杂产品,考虑到代码的可读性,只列出部分成员属性,且成员属性的类型均为String,真实情况下,有些成员属性的类型需自定义

class Actor

{

       private  String type; //角色类型

       private  String sex; //性别

       private  String face; //脸型

       private  String costume; //服装

       private  String hairstyle; //发型

      

       public  void setType(String type) {

              this.type  = type;

       }

       public  void setSex(String sex) {

              this.sex  = sex;

       }

       public  void setFace(String face) {

              this.face  = face;

       }

       public  void setCostume(String costume) {

              this.costume  = costume;

       }

       public  void setHairstyle(String hairstyle) {

              this.hairstyle  = hairstyle;

       }

       public  String getType() {

              return  (this.type);

       }

       public  String getSex() {

              return  (this.sex);

       }

       public  String getFace() {

              return  (this.face);

       }

       public  String getCostume() {

              return  (this.costume);

       }

       public  String getHairstyle() {

              return  (this.hairstyle);

       }

}

 

//角色建造器:抽象建造者

abstract class ActorBuilder

{

       protected  Actor actor = new Actor();

      

       public  abstract void buildType();

       public  abstract void buildSex();

       public  abstract void buildFace();

       public  abstract void buildCostume();

       public  abstract void buildHairstyle();

 

    //工厂方法,返回一个完整的游戏角色对象

       public Actor createActor()

       {

              return actor;

       }

}

 

//英雄角色建造器:具体建造者

class HeroBuilder extends ActorBuilder

{

       public  void buildType()

       {

              actor.setType("英雄");

       }

       public  void buildSex()

       {

              actor.setSex("男");

       }

       public  void buildFace()

       {

              actor.setFace("英俊");

       }

       public  void buildCostume()

       {

              actor.setCostume("盔甲");

       }

       public  void buildHairstyle()

       {

              actor.setHairstyle("飘逸");

       }    

}

 

//天使角色建造器:具体建造者

class AngelBuilder extends ActorBuilder

{

       public  void buildType()

       {

              actor.setType("天使");

       }

       public  void buildSex()

       {

              actor.setSex("女");

       }

       public  void buildFace()

       {

              actor.setFace("漂亮");

       }

       public  void buildCostume()

       {

              actor.setCostume("白裙");

       }

       public  void buildHairstyle()

       {

              actor.setHairstyle("披肩长发");

       }    

}

 

//恶魔角色建造器:具体建造者

class DevilBuilder extends ActorBuilder

{

       public  void buildType()

       {

              actor.setType("恶魔");

       }

       public  void buildSex()

       {

              actor.setSex("妖");

       }

       public  void buildFace()

       {

              actor.setFace("丑陋");

       }

       public  void buildCostume()

       {

              actor.setCostume("黑衣");

       }

       public  void buildHairstyle()

       {

              actor.setHairstyle("光头");

       }    

}

//游戏角色创建控制器:指挥者

class ActorController

{

    //逐步构建复杂产品对象

       public Actor construct(ActorBuilder ab)

       {

              Actor actor;

              ab.buildType();

              ab.buildSex();

              ab.buildFace();

              ab.buildCostume();

              ab.buildHairstyle();

              actor=ab.createActor();

              return actor;

       }

}

为了提高系统的灵活性和可扩展性,我们将具体建造者类的类名存储在配置文件中,并通过工具类XMLUtil来读取配置文件并反射生成对象,XMLUtil类的代码如下所示:
import javax.xml.parsers.*;

import org.w3c.dom.*;

import org.xml.sax.SAXException;

import java.io.*;

class XMLUtil

{

//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象

       public  static Object getBean()

       {

              try

              {

                     //创建文档对象

                     DocumentBuilderFactory  dFactory = DocumentBuilderFactory.newInstance();

                     DocumentBuilder  builder = dFactory.newDocumentBuilder();

                     Document  doc;                                                

                     doc  = builder.parse(new File("config.xml"));

             

                     //获取包含类名的文本节点

                     NodeList  nl = doc.getElementsByTagName("className");

            Node  classNode=nl.item(0).getFirstChild();

            String  cName=classNode.getNodeValue();

           

            //通过类名生成实例对象并将其返回

            Class c=Class.forName(cName);

                 Object obj=c.newInstance();

            return obj;

         }  

         catch(Exception e)

         {

              e.printStackTrace();

              return null;

          }

       }

}

<?xml version="1.0"?>

<config>

       <className>AngelBuilder</className>

</config>    

class Client

{

       public  static void main(String args[])

       {

              ActorBuilder ab; //针对抽象建造者编程

              ab =  (ActorBuilder)XMLUtil.getBean(); //反射生成具体建造者对象

 

         ActorController ac = new  ActorController();

              Actor actor;

              actor = ac.construct(ab); //通过指挥者创建完整的建造者对象

 

              String  type = actor.getType();

              System.out.println(type  + "的外观:");

              System.out.println("性别:" + actor.getSex());

              System.out.println("面容:" + actor.getFace());

              System.out.println("服装:" + actor.getCostume());

              System.out.println("发型:" + actor.getHairstyle());

       }

}

天使的外观:

性别:女

面容:漂亮

服装:白裙

发型:披肩长发

主要优点

      建造者模式的主要优点如下:

(1) 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。

(2) 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合“开闭原则”

(3) 可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。

主要缺点

      建造者模式的主要缺点如下:

(1) 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,例如很多组成部分都不相同,不适合使用建造者模式,因此其使用范围受到一定的限制。

(2) 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。

适用场景

      在以下情况下可以考虑使用建造者模式:

(1) 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。

(2) 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。

(3) 对象的创建过程独立于创建该对象的类。在建造者模式中通过引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类和客户类中。

(4) 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。


设计模式五:建造者模式

标签:设计模式

原文地址:http://blog.csdn.net/caowei0403/article/details/45671133

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!