“变化的流水线”:建造者模式

本文介绍建造者模式在软件系统中的应用,尤其适用于复杂对象的构建。通过实例展示如何使用该模式来封装变化的部分,保持构建过程的稳定性。
在软件系统中,有时面临着一个复杂对象的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。如何提供一种"封装机制"来隔离出"各个部分"的变化,从而保持系统中的"稳定构建算法"不随需求的改变而改变?
建造者(Builder)模式也叫生成器模式。用它来创建对象,目的是省去在对象发生变化时,需要修改代码中每一处对象创建的地方,应用这种模式,可以在一个复杂对象的内部结构(由许多其他子对象构成的结构)发生变化时,仅需要对对象有所修改,而复杂对象与其他的对象之间的关系、行为不需要进行修改。
GOF:将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。


举例来说, 假设有一台没有安装任何系统的苹果macbook笔记本,现在要“创建”一种集上网浏览网页,聊天和看电影这三种最基本功能的应用系统。
这里我们可以给出两种不同的实现途径:1、安装windows操作系统,使用firefox浏览器,windows版本的qq和暴风影音。2、安装macintosh操作系统,使用mac版本下的firefox浏览器,luma qq和暴风影音。
分析上面的两种途径,我们发现,构建系统时,操作系统,浏览器软件,聊天软件和视频软件组合到一起的算法相对稳定,但是任一种途径中,它们使用的软件(包括浏览器,聊天工具和视频软件)都会面临着剧烈的变化(比如浏览器,不管windows还是mac系统,都可能改变为使用google浏览器等)。毫无疑问,我们会利用建造者模式来应对构成复杂但构成结构和顺序相对稳定的对象的创建工作。
看实现代码:
ContractedBlock.gifExpandedBlockStart.gifCode
using System;
using System.Collections;
using System.Collections.Generic;

namespace BuilderPattern
{
    
/*应用系统和组成的子系统对应抽象类*/
    
//应用系统
    public abstract class AppSystem
    {
        
public abstract void SaySomething();
    }
    
//操作系统
    public abstract class OS
    {

    }
    
//浏览器
    public abstract class Browser
    {

    }
    
//聊天软件
    public abstract class ChatTool
    {

    }
    
//观看视频软件
    public abstract class VideoTool
    {

    }

    
//windows应用系统
    public  class WindowsAppSystem:AppSystem
    {
        
public override void SaySomething()
        {
            Console.WriteLine(
"You  created a best system of the world.");
        }
    }
    
//macintosh应用系统
    public  class MacintoshAppSystem:AppSystem
    {
        
public override void SaySomething()
        {
            Console.WriteLine(
"You did really created a best system of the world.");
        }
    }

    
//应用系统Builder类 
    public abstract class AppBuilder
    {
        
public abstract void BuildOS();
        
public abstract void BuildBrowser();
        
public abstract void BuildChatTool();
        
public abstract void BuildVideoTool();

        
public abstract AppSystem GetAppSystem(); //返回一个应用系统
    }

    
//具体应用系统Builder类 --windows应用系统
    public class WindowsAppBuilder : AppBuilder
    {
        
private AppSystem winApp = new WindowsAppSystem();
        
public override void BuildOS()
        {
            Console.WriteLine(
"i choose windows vista as my system:");
        }
        
public override void BuildBrowser()
        {
            Console.WriteLine(
"ie is default browser,but i choose firefox.");
        }
        
public override void BuildChatTool()
        {
            Console.WriteLine(
"msn is default chat tool,but i choose qq.");
        }
        
public override void BuildVideoTool()
        {
            Console.WriteLine(
"wmp is default video tool,but i choose bfyy.");
        }
        
public override AppSystem GetAppSystem()
        {
            
return winApp;
        }
    }

    
//具体应用系统Builder类 --mac应用系统
    public class MacintoshAppBuilder : AppBuilder
    {
        
private AppSystem macApp = new MacintoshAppSystem();
        
public override void BuildOS()
        {
            Console.WriteLine(
"i choose mac os x as my system:");
        }
        
public override void BuildBrowser()
        {
            Console.WriteLine(
"safari is default browser,but i choose firefox.");
        }
        
public override void BuildChatTool()
        {
            Console.WriteLine(
"ichat is default chat tool,but i choose luma qq.");
        }
        
public override void BuildVideoTool()
        {
            Console.WriteLine(
"quicktime is default video tool,but i choose bfyy.");
        }
        
public override AppSystem GetAppSystem()
        {
            
return macApp;
        }
    }

    
public class Director
    {
        
//这个方法用来“指导”建造一种应用系统(最常用)
        public void Construct(AppBuilder builder)
        {
            builder.BuildOS();
            builder.BuildBrowser();
            builder.BuildChatTool();
            builder.BuildVideoTool();
        }

        
//返回一种具体的应用系统
        public AppSystem ConstructAppSystem(AppBuilder builder)
        {
            builder.BuildOS();
            builder.BuildBrowser();
            builder.BuildChatTool();
            builder.BuildVideoTool();
            
return builder.GetAppSystem();
        }
    }

    
//客户端调用
    public class Program
    {
        
static void Main()
        {
            AppBuilder appBuilder 
= new WindowsAppBuilder(); //实际项目中,都是通过配置文件然后反射决定生成那一种
            Director director = new Director();
            director.Construct(appBuilder);

            Console.WriteLine(
"----------------------------------------------");

            
//下面建造一种具体的应用系统
            AppSystem system = director.ConstructAppSystem(new MacintoshAppBuilder());

            Console.WriteLine(
"----------------------------------------------");
            system.SaySomething();
        }
    }

}
最后:正如你所看到的,一个应用系统的构成都是由其子系统(从操作系统到相关软件)组合(Composite)而来的,所以建造者模式和组合模式有很多联系,通常它们都结合在一起使用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值