温故而知新:设计模式之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月前
|
设计模式 算法
设计模式--建造者模式 builder
这篇文章通过一个电脑购买的例子,详细解释了建造者模式的四个角色(产品类、抽象构建者、实体构建类和指导者类),并提供了相应的代码实现,阐述了建造者模式在设计复杂对象时的应用和优势。
设计模式--建造者模式 builder
|
9月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
9月前
|
设计模式 算法 索引
程序技术好文:设计模式之美:Builder(生成器)
程序技术好文:设计模式之美:Builder(生成器)
|
10月前
|
设计模式 算法 Java
【设计模式】JAVA Design Patterns——Builder(构造器模式)
【设计模式】JAVA Design Patterns——Builder(构造器模式)
|
10月前
|
设计模式 安全 Java
构建未来应用:Java设计模式 - 建造者模式(Builder)在现代编程中的应用
【4月更文挑战第7天】建造者模式是提升代码质量的关键,尤其在复杂环境中。它分步骤构建对象,将构建与表示分离,适用于UI构建、数据模型组装、配置文件解析和网络请求构造等场景。最佳实践包括明确构建步骤、提供默认值、支持链式调用和确保线程安全。然而,过多步骤、不一致状态和性能问题是使用时需注意的问题。掌握建造者模式对于现代编程至关重要。
104 3
|
设计模式 缓存 Java
认真学习设计模式之建造者模式(Builder Pattern)
认真学习设计模式之建造者模式(Builder Pattern)
140 1
|
设计模式 算法
设计模式10 - 建造者模式【Builder Pattern】
设计模式10 - 建造者模式【Builder Pattern】
65 0
|
设计模式 缓存 Java
【设计模式——学习笔记】23种设计模式——建造者模式Builder(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——建造者模式Builder(原理讲解+应用场景介绍+案例介绍+Java代码实现)
205 0
|
设计模式 算法 定位技术
【3W2H设计模式】-建造者模式(Builder Pattern)
【3W2H设计模式】-建造者模式(Builder Pattern)
195 0
|
设计模式 算法 Java
Java设计模式-建造者模式(Builder)
Java设计模式-建造者模式(Builder)