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

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

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

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


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

  1. package com.designpattern.builder;  
  2.   
  3. public interface Mouse {  
  4.     public void add();  
  5. }  

  1. package com.designpattern.builder;  
  2.   
  3. public interface Monitor {  
  4.     public void add();  
  5. }  

  1. package com.designpattern.builder;  
  2.   
  3. public interface Keyboard {  
  4.     public void add();  
  5. }  

  1. package com.designpattern.builder;  
  2.   
  3. public interface Displayer {  
  4.     public void add();  
  5. }  

  1. package com.designpattern.builder;  
  2.   
  3. public interface Factory {  
  4.     public Computer buildComputer();  
  5. }  

  1. package com.designpattern.builder;  
  2.   
  3. public interface Computer {  
  4.     public void add();  
  5. }  

  1. package com.designpattern.builder;  
  2.   
  3. public class AcerMouse implements Mouse {  
  4.   
  5.     @Override  
  6.     public void add() {  
  7.         System.out.println("add AcerMouse");  
  8.     }  
  9.   
  10. }  

  1. package com.designpattern.builder;  
  2.   
  3. public class AcerMonitor implements Monitor {  
  4.   
  5.     @Override  
  6.     public void add() {  
  7.         System.out.println("add AcerMonitor");  
  8.     }  
  9.   
  10. }  

  1. package com.designpattern.builder;  
  2.   
  3. public class AcerKeyboard implements Keyboard {  
  4.   
  5.     @Override  
  6.     public void add() {  
  7.         System.out.println("add AcerKeyboard");  
  8.     }  
  9.   
  10. }  

  1. package com.designpattern.builder;  
  2.   
  3. public class AcerDisplayer implements Displayer {  
  4.   
  5.     @Override  
  6.     public void add() {  
  7.         System.out.println("add AcerDisplayer");  
  8.     }  
  9.   
  10. }  

  1. package com.designpattern.builder;  
  2.   
  3. public class AcerFactory implements Factory {  
  4.       
  5.     @Override  
  6.     public Computer buildComputer() {  
  7.         return new Acer();  
  8.     }  
  9. }  

  1. package com.designpattern.builder;  
  2.   
  3. public class Acer implements Computer {  
  4.   
  5.     @Override  
  6.     public void add() {  
  7.         System.out.println("builder Acer");  
  8.     }  
  9.   
  10. }  

  1. package com.designpattern.builder;  
  2.   
  3. import java.lang.reflect.Method;  
  4.   
  5. public class Builder {  
  6.     private Factory factory;  
  7.   
  8.     public Builder(Factory factory) {  
  9.         this.factory = factory;  
  10.     }  
  11.   
  12.     public void builder() throws Exception {  
  13.         factory.buildComputer().add();  
  14.         String computer = factory.getClass().toString();  
  15.         computer = computer.substring(6, computer.length() - 7);  
  16.   
  17.         // build Mouse  
  18.         Class c = Class.forName(computer + "Mouse");  
  19.         Mouse mouse = (Mouse) c.newInstance();  
  20.         Method method = c.getMethod("add"null);  
  21.         method.invoke(mouse, null);  
  22.   
  23.         // build Keyboard  
  24.         c = Class.forName(computer + "Keyboard");  
  25.         Keyboard keyboard = (Keyboard) c.newInstance();  
  26.         method = c.getMethod("add"null);  
  27.         method.invoke(keyboard, null);  
  28.   
  29.         // build Displayer  
  30.         c = Class.forName(computer + "Displayer");  
  31.         Displayer displayer = (Displayer) c.newInstance();  
  32.         method = c.getMethod("add"null);  
  33.         method.invoke(displayer, null);  
  34.   
  35.         // build Monitor  
  36.         c = Class.forName(computer + "Monitor");  
  37.         Monitor monitor = (Monitor) c.newInstance();  
  38.         method = c.getMethod("add"null);  
  39.         method.invoke(monitor, null);  
  40.   
  41.         System.out.println("build complete");  
  42.     }  
  43. }  

  1. package com.designpattern.builder;  
  2.   
  3. public class Client {  
  4.     public static void main(String[] args) {  
  5.         try {  
  6.             new Builder(new AcerFactory()).builder();  
  7.         } catch (Exception e) {  
  8.             // TODO Auto-generated catch block  
  9.             e.printStackTrace();  
  10.         }  
  11.     }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值