GoF设计模式:BuliderParttern建造者模式
建造者模式定义:将一个复杂的对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。将复杂的对象一步一步的创建。
建造者模式包含的角色:
- Bulider抽象建造者:抽象建造者为一个产品Product对象的各个部件指定抽象接口,如:buliderPartA(),或者是得到一个复杂对象getResult()。
- ConcreteBuilder具体创建者:具体创建者顾名思义就是实现抽象创建者定义的各个接口和抽象方法,或者是提供一个方法返回创建好的复杂对象。
- Product产品角色:产品角色是被构建的复杂对象,包含多个组件构成,具体创建者创建该产品的内部表示并定义它的装备过程。
- Director指挥者:又叫做导演类,负责安培复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。
- 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());
}
}
心情不好不想解释什么,都是我自己敲的代码烦