温故而知新:设计模式之Builder

简介: Builder模式主要用于以下场景: 需要创建一个较复杂的大对象实例,并且构成该对象的子对象可能经常会发生变化,但是组成大对象的算法却相对稳定。 比如:我们做b/s开发时,经常会遇到一些系统要求支持模板/皮肤切换,一个完整的页面由若干子模块组成,不管模板如何变换,子模块的内容/位置如何变化,但组成页面的算法即相对固定。

Builder模式主要用于以下场景:

需要创建一个较复杂的大对象实例,并且构成该对象的子对象可能经常会发生变化,但是组成大对象的算法却相对稳定。

比如:我们做b/s开发时,经常会遇到一些系统要求支持模板/皮肤切换,一个完整的页面由若干子模块组成,不管模板如何变换,子模块的内容/位置如何变化,但组成页面的算法即相对固定。

我们假定每个页面由header,body,footer三个基本模块组成,先抽象出来:

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 接口抽象部分
#region  把不依赖具体细节的部分(即相当稳定,不变的部分)抽象出来
    
public   interface  IShow
    {
        
void  Show();
    }


    
///   <summary>
    
///  页面头部 抽象类
    
///   </summary>
     public   abstract   class  Header : IShow
    {
        
public   abstract   void  Show();
    }

    
///   <summary>
    
///  页面主体 抽象类
    
///   </summary>
     public   abstract   class  Body : IShow
    {
        
public   abstract   void  Show();
    }

    
///   <summary>
    
///  页面底部 抽象类
    
///   </summary>
     public   abstract   class  Footer : IShow
    {
        
public   abstract   void  Show();
    }

    
///   <summary>
    
///  页面基类 抽象类
    
///   </summary>
     public   class  MainPage
    {
        
private  List < IShow >  _lstParts;

        
public  List < IShow >  Parts
        {
            
set  { _lstParts  =  value; }
            
get
            {
                
if  (_lstParts  ==   null )
                {
                    _lstParts 
=   new  List < IShow > ();
                }
                
return  _lstParts;
            }
        }

        
public   void  Show()
        {
            
for  ( int  i  =   0 ; i  <  _lstParts.Count; i ++ )
            {
                _lstParts[i].Show();
            }
            Console.Write(
" 页面构建完毕! " );
        }


    }

    
///   <summary>
    
///  创建器 抽象类
    
///   </summary>
     public   abstract   class  Builder
    {
        
// 不管页面风格如何变换,下面的这些部件的创建算法,相对要求比较稳定

        
public   abstract   void  BuildHeader();

        
public   abstract   void  BuildBody();

        
public   abstract   void  BuildFooter();

        
public   abstract  MainPage GetPage();

    }
    
#endregion

客户端程序依赖于上面的抽象:

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
///   <summary>
    
///  客户程序
    
///   </summary>
     public   class  PageManager
    {
        Builder _builder;

        
public  PageManager(Builder b)
        {
            
this ._builder  =  b;
        }

        
public   void  Show()
        {
            
this ._builder.BuildHeader();
            
this ._builder.BuildBody();
            
this ._builder.BuildFooter();
            
this ._builder.GetPage().Show();
        }
    }

最后完成具体模板的实现 :

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
#region  spring风格的具体页面及创建器
    
public   class  SpringHeader : Header
    {
        
public   override   void  Show()
        {
            Console.WriteLine(
" Spring风格的header " );
        }
    }

    
public   class  SpringBody : Body
    {
        
public   override   void  Show()
        {
            Console.WriteLine(
" Spring风格的body " );
        }
    }

    
public   class  SpringFooter : Footer
    {
        
public   override   void  Show()
        {
            Console.WriteLine(
" Spring风格的footer " );
        }
    }

    
public   class  SpringBuilder : Builder
    {
        MainPage _mainPage;

        
public  SpringBuilder()
        {
            _mainPage 
=   new  MainPage();
        }

        
public   override   void  BuildHeader()
        {
            _mainPage.Parts.Add(
new  SpringHeader());
        }

        
public   override   void  BuildBody()
        {
            _mainPage.Parts.Add(
new  SpringBody());
        }

        
public   override   void  BuildFooter()
        {
            _mainPage.Parts.Add(
new  SpringFooter());
        }

        
public   override  MainPage GetPage()
        {
            
return  _mainPage;
        }


    }
    
#endregion


    
#region  summer风格的具体页面及创建器
    
public   class  SummerHeader : Header
    {
        
public   override   void  Show()
        {
            Console.WriteLine(
" Summer风格的header " );
        }
    }

    
public   class  SummerBody : Body
    {
        
public   override   void  Show()
        {
            Console.WriteLine(
" Summer风格的body " );
        }
    }

    
public   class  SummerFooter : Footer
    {
        
public   override   void  Show()
        {
            Console.WriteLine(
" Summer风格的footer " );
        }
    }

    
public   class  SummerBuilder : Builder
    {
        MainPage _mainPage;

        
public  SummerBuilder()
        {
            _mainPage 
=   new  MainPage();
        }

        
public   override   void  BuildHeader()
        {
            _mainPage.Parts.Add(
new  SummerHeader());
        }

        
public   override   void  BuildBody()
        {
            _mainPage.Parts.Add(
new  SummerBody());
        }

        
public   override   void  BuildFooter()
        {
            _mainPage.Parts.Add(
new  SummerFooter());
        }

        
public   override  MainPage GetPage()
        {
            
return  _mainPage;
        }


    }
    
#endregion

我们还是利用反射来解除最终具体类型的依赖:

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
<? xml version="1.0" encoding="utf-8"  ?>
< configuration >
  
< appSettings >
    
< add  key ="AssemblyName"  value ="Builder" />
    
< add  key ="BuilderType"  value ="Builder.SpringBuilder" />
  
</ appSettings >
</ configuration >

主程序

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
using  System;
using  System.Collections.Generic;
using  System.Reflection;
using  System.Configuration;

namespace  Builder
{
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            Builder bdr 
=  (Builder)Assembly.Load(ConfigurationManager.AppSettings[ " AssemblyName " ].ToString()).CreateInstance(ConfigurationManager.AppSettings[ " BuilderType " ].ToString());
            PageManager pm 
=   new  PageManager(bdr);
            pm.Show();
            Console.Read();
        }
    }

}

 

 img_0006733aae3d7358f6f9691022897892.png

目录
相关文章
|
6月前
|
设计模式 算法
设计模式10 - 建造者模式【Builder Pattern】
设计模式10 - 建造者模式【Builder Pattern】
16 0
|
5月前
|
设计模式 缓存 Java
认真学习设计模式之建造者模式(Builder Pattern)
认真学习设计模式之建造者模式(Builder Pattern)
59 1
|
6月前
|
设计模式 缓存 Java
【设计模式——学习笔记】23种设计模式——建造者模式Builder(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——建造者模式Builder(原理讲解+应用场景介绍+案例介绍+Java代码实现)
53 0
|
8月前
|
设计模式 算法 定位技术
【3W2H设计模式】-建造者模式(Builder Pattern)
【3W2H设计模式】-建造者模式(Builder Pattern)
126 0
|
11月前
|
设计模式 算法 Java
Java设计模式-建造者模式(Builder)
Java设计模式-建造者模式(Builder)
|
设计模式 API
设计模式学习(十一):Builder建造者模式
设计模式学习(十一):Builder建造者模式
设计模式学习(十一):Builder建造者模式
|
设计模式
设计模式 - 建造者模式 Lombok @Builder 实操
设计模式 - 建造者模式 Lombok @Builder 实操
385 0
设计模式 - 建造者模式 Lombok @Builder 实操
|
设计模式 Java
设计模式系列3 - builder模式
主要讲解建造者builder模式和实际应用的场景,基于java。
209 0
设计模式系列3 - builder模式
|
设计模式
从零开始学设计模式(五):建造者模式(Builder Pattern)
在现实世界中的很多东西都是由很多组成部分构成的,比如房子它由砖头、水泥、石灰、钢筋等组成,即一个个简单的组成部分构成了一个复杂的房子。同样在软件系统中也存在很多复杂对象,而复杂对象的一些属性就相当于盖房子的材料,创建对象的过程就相当于盖房子的过程。由于组合部件的过程很复杂,因此,这些部件的组合过程往往被“外部化”到一个称作建造者的对象里,然后建造者返还一个已经建造完毕的完整产品对象,而用户无须关心该对象所包含的属性以及它们的组装方式,这就是建造者模式的模式动机。
164 0
从零开始学设计模式(五):建造者模式(Builder Pattern)
|
设计模式 Java
Java的二十三种设计模式(建造者模式(Builder))
Java的二十三种设计模式(建造者模式(Builder))
90 0