GoF设计模式:BuliderParttern建造者模式

本文介绍了GoF设计模式中的建造者模式,旨在将复杂对象的构建与其表示分离,允许同样的构建过程创建不同表示。文章阐述了建造者模式的四个主要角色:抽象建造者、具体建造者、产品角色和指挥者,并通过一个游戏人物角色创建的例子来说明其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GoF设计模式:BuliderParttern建造者模式
建造者模式定义:将一个复杂的对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。将复杂的对象一步一步的创建。


建造者模式包含的角色:

  1. Bulider抽象建造者:抽象建造者为一个产品Product对象的各个部件指定抽象接口,如:buliderPartA(),或者是得到一个复杂对象getResult()。
  2. ConcreteBuilder具体创建者:具体创建者顾名思义就是实现抽象创建者定义的各个接口和抽象方法,或者是提供一个方法返回创建好的复杂对象。
  3. Product产品角色:产品角色是被构建的复杂对象,包含多个组件构成,具体创建者创建该产品的内部表示并定义它的装备过程。
  4. Director指挥者:又叫做导演类,负责安培复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。
  5. 5.

接下来我们来看一个例子:
某游戏软件中人物角色包括多种类型,不同类型的人物角色,其性别、脸型、服装、发型等外部特性有所差异,使用建造者模式创建人物角色对象,要求绘制类图并编程实现

public class Role {
    private String sex;
    private String face;
    private String clothing;
    private String hairStyle;

    public void  setSex(final String sex) {
        this.sex = sex;
    }

    public void setFace(final String face) {
        this.face = face;
    }

    public void setClothing(final String clothing) {
        this.clothing = clothing;
    }

    public void setHairStyle(final String hairStyle) {
        this.hairStyle = hairStyle;
    }

    public String getSex() {
        return this.sex;
    }

    public String getFace() {
        return this.face;
    }

    public String getClothing() {
        return this.clothing;
    }

    public String getHairStyle() {
        return this.hairStyle;
    }
}
public abstract class RoleBuilder {
    protected Role role = new Role();

    public abstract void buildeSex();
    public abstract void buildeFace();
    public abstract void buildeClothing();
    public abstract void buildeHairStyle();

    public Role getRole() {
        return role;
    }
}
public class ObjRoleBuilderMan extends RoleBuilder {

    public void buildeSex() {
        role.setSex("Man");
    }

    public void buildeFace() {
        role.setFace("英俊");
    }

    public void buildeClothing() {
        role.setClothing("西装");
    }

    public void buildeHairStyle() {
        role.setHairStyle("圆寸");
    }
}
public class ObjRoleBuilderWoman extends RoleBuilder {

    public void buildeSex() {
        role.setSex("女人");
    }
    public void buildeFace() {
        role.setFace("漂亮");
    }
    public void buildeClothing() {
        role.setClothing("裙子");
    }
    public void buildeHairStyle() {
        role.setHairStyle("长发");
    }
}
public class RoleController {
    private RoleBuilder roleBuilder;

    public void setRoleBuilder(final RoleBuilder roleBuilder) {
        this.roleBuilder = roleBuilder;
    }

    public Role construct() {
        roleBuilder.buildeSex();
        roleBuilder.buildeFace();
        roleBuilder.buildeClothing();
        roleBuilder.buildeHairStyle();
        return roleBuilder.getRole();
    }
}
package edu.fjnu.BuilderParttern;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

/**
 * Created by Administrator on 2017/3/13 0013.

 */
public class XMLUtil {
    /**
     * 从配置文件中获取具体类名
     * @return
     */
    public static Object getBean() {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc;
            doc = builder.parse(new File("Role.xml"));

            NodeList nodeList = doc.getElementsByTagName("className");
            Node node = nodeList.item(0).getFirstChild();
            String cname = node.getNodeValue();

            System.out.println(cname);
            //这里是反射的用法,需要写全名
            Class c = Class.forName(cname);
            Object object = c.newInstance();
            System.out.println(c.getName());
            return object;

            //return new SqlFactory();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
public class Client {
    public static void main(final String[] a) {
        RoleBuilder roleBuilder = (RoleBuilder) XMLUtil.getBean();

        RoleController roleController = new RoleController();
        roleController.setRoleBuilder(roleBuilder);

        Role role = roleController.construct();

        System.out.println("角色组成:");
        System.out.println(role.getSex());
        System.out.println(role.getFace());
        System.out.println(role.getClothing());
        System.out.println(role.getHairStyle());
    }
}

心情不好不想解释什么,都是我自己敲的代码烦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值