您的位置:首页 > 产品设计 > UI/UE

设计模式 (四)创建者模式(Builder)

2012-04-12 15:38 399 查看
创建者模式主要是为了所谓的高聚合,解耦合,遇到多种配件于一身的情况的时候,放在实体类里面不合适,放在工厂类也不合适,所以就添加了一个创建者类,专门对相应的零件进行组装,如同汽车了N中配件,同时要是各种配件互相联系的话也在这个Builder里面一并做了。

明天准备去爬山,这个原理图就再补上吧:

今天把uml补上了,不过对于uml初学的我就乱乱的先随便画一个吧,等以后慢慢入门了在斟酌里面的错误和细节:



下面是我自己攒出来的例子(回来的时候着急,把书忘教室了,不知道书上怎么写的,不过明显记得一处错误,构造器也加上了一个void),为了在Builder里面优化一下,用了一下反射,这样就可以直接通过多态来实现对于派生类中的实体类进行初始化并且操作了,简单的实现电脑的组装:通过工厂类实例化Computer的父类指向子类的实例,然后在Builder里面添加一个工厂类的私有变量,通过构造器把要穿件的Computer实例传入Builder,然后对其进行解析,反射得到路径,对其派生类里面的方法进行反射得到相应的配件的集成,转配完成。少说多做:

[java]
view plaincopy

package com.designpattern.builder;

public interface Mouse {
public void add();
}

[java]
view plaincopy

package com.designpattern.builder;

public interface Monitor {
public void add();
}

[java]
view plaincopy

package com.designpattern.builder;

public interface Keyboard {
public void add();
}

[java]
view plaincopy

package com.designpattern.builder;

public interface Displayer {
public void add();
}

[java]
view plaincopy

package com.designpattern.builder;

public interface Factory {
public Computer buildComputer();
}

[java]
view plaincopy

package com.designpattern.builder;

public interface Computer {
public void add();
}

[java]
view plaincopy

package com.designpattern.builder;

public class AcerMouse implements Mouse {

@Override
public void add() {
System.out.println("add AcerMouse");
}

}

[java]
view plaincopy

package com.designpattern.builder;

public class AcerMonitor implements Monitor {

@Override
public void add() {
System.out.println("add AcerMonitor");
}

}

[java]
view plaincopy

package com.designpattern.builder;

public class AcerKeyboard implements Keyboard {

@Override
public void add() {
System.out.println("add AcerKeyboard");
}

}

[java]
view plaincopy

package com.designpattern.builder;

public class AcerDisplayer implements Displayer {

@Override
public void add() {
System.out.println("add AcerDisplayer");
}

}

[java]
view plaincopy

package com.designpattern.builder;

public class AcerFactory implements Factory {

@Override
public Computer buildComputer() {
return new Acer();
}
}

[java]
view plaincopy

package com.designpattern.builder;

public class Acer implements Computer {

@Override
public void add() {
System.out.println("builder Acer");
}

}

[java]
view plaincopy

package com.designpattern.builder;

import java.lang.reflect.Method;

public class Builder {
private Factory factory;

public Builder(Factory factory) {
this.factory = factory;
}

public void builder() throws Exception {
factory.buildComputer().add();
String computer = factory.getClass().toString();
computer = computer.substring(6, computer.length() - 7);

// build Mouse
Class c = Class.forName(computer + "Mouse");
Mouse mouse = (Mouse) c.newInstance();
Method method = c.getMethod("add", null);
method.invoke(mouse, null);

// build Keyboard
c = Class.forName(computer + "Keyboard");
Keyboard keyboard = (Keyboard) c.newInstance();
method = c.getMethod("add", null);
method.invoke(keyboard, null);

// build Displayer
c = Class.forName(computer + "Displayer");
Displayer displayer = (Displayer) c.newInstance();
method = c.getMethod("add", null);
method.invoke(displayer, null);

// build Monitor
c = Class.forName(computer + "Monitor");
Monitor monitor = (Monitor) c.newInstance();
method = c.getMethod("add", null);
method.invoke(monitor, null);

System.out.println("build complete");
}
}

[java]
view plaincopy

package com.designpattern.builder;

public class Client {
public static void main(String[] args) {
try {
new Builder(new AcerFactory()).builder();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: