设计模式学习笔记之 Builder 

     Builder模式是用来创建一种相对复杂的对象,这种对象的各个部分的变化比较剧烈,而将这些部分组合起来的算法却是比较稳定。利用Builder模式,我们可以将复杂对象的构建和表示分离开,使得同样的构建过程可以创建不同的对象。

     这里我举一个装机的例子:机器就是一个相对复杂的对象,有许多配置可以挑选,而将它们组合起来的方法是固定的。

    public abstract class CPU
    
{
    }

    
public abstract class MainBoard
    
{
    }

    
public abstract class HardDisk
    
{
    }

    
public abstract class ComputerBuilder
    
{
        
public abstract void CPUBuilder();
        
public abstract void MainBoardBuilder();
        
public abstract void HardDiskBuilder();
        
public abstract Computer GetComputer();
    }

    
public abstract class Computer
    
{
    }

     这里的Computer都是由CPU,HardDisk,MainBoard组成,而且组合它们的方法相对稳定,这样当我们要具体实现的时候:

    public class MyCPU : CPU
    
{
         
//
    }

    
public class MyMainBoard : MainBoard
    
{
         
//
    }

    
public class MyHardDisk : HardDisk
    
{
         
//
    }

    
public class MyComputer : Computer
    
{
         
//
    }

    
public class MyComputerBuilder : ComputerBuilder
    
{
        
public override void CPUBuilder()
        
{
              
//… 选择我的CPU
        }

        
public override void MainBoardBuilder()
        
{
              
//… 选择我的MainBoard
        }

        
public override void HardDiskBuilder()
        
{
              
//… 选择我的HardDisk
        }

        
public override Computer GetComputer()
        
{
            
return new MyComputer();
        }

    }

     上面这段代码用继承自CPU等抽象类的类来表示我所需要的配置,继承自ComputerBuilder的 MyComputerBuilder来构建Computer

    public class Manager
    
{
        
public Computer ComputerManager(ComputerBuilder builder)
        
{
            
//按要求在这里Build  稳定的部分
            builder.CPUBuilder();
            builder.HardDiskBuilder();
            builder.MainBoardBuilder();
            builder.HardDiskBuilder();
            
return builder.GetComputer();
        }

    }

     这里定义了Computer内部的组合方法,也是我们需要保持稳定的部分。这里我们可以看到,所有计算机都是由1CPU,1MainBoard,2HardDisk组成,是不会发生剧烈变化的。当应用时:

    private static void BuilderTest()
    
{
        Manager myManager 
= new Manager();
        Computer myComputer 
= myManager.ComputerManager(new MyComputerBuilder());
    }

     当我们要另一种Computer时,只要添加新的继承自ComputerBuilder的类,在CPUBulider等中构建所需要的配置,并在上面修ComputerManager的参数即可,不需要修改Manager,它们之间不存在任何依赖,也就是构建和表示分离了。

     和上一篇相同,我们可以通过反射的方法来创建ComputerBuilder,这样就可以通过修改配置文件来达到构建不同Computer的目的了。

     Builder和Abstract Factory有很多相似之处,但是它们还是有差别的,Abstract Factory的对象之间是有紧耦合关系的,它只能在不同系列之间变换。Builder的对象是同属于一个基本对象的子对象,每个部分都是可以变化的,在上例中就可以看到,CPU等部件都是可以在CPUBuilder()中选择不同的配置的,它们之间并没有引用关系。

参考: MSDNWebCast C#设计模式纵横谈    李建忠

     回到目录
 

posted on 2006-09-10 16:30  aiya  阅读(271)  评论(0)    收藏  举报