设计模式之抽象工厂(AbstractFactory)---用抽象工厂实现网页样式生成器

 意图[gof 设计模式]:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

     我们经常会碰到这样一种情况,我们需要一系列的平级对象来共同完成一种服务。对象的变化更多的是系列间的变化,而不是系列对象内部关系的变化。比如说数据库操作相关类。命令对象,链接对象,适配器对象。我们需要增加一种新数据访问相关对象的可能性比较小。但是从mssql 命令对象,连接对象....到oracle命令对象,连接对象....的可能性则大得多。那么怎样实现一种面向在系列对象变化方向扩展性的解决方案呢。答案就是抽象工厂。

下面来分析一个具体情景:
    假如我要一个html 生成器,生成的html 粗略的分成 head、 body 、foot 三个部分。 head+ body +foot 这种抽象的结构是相对稳定的。但是具体的样式可能分为古典型(古典型head + 古典型 body + 古典型 foot),时尚型(时尚型 head + 时尚型 body +时尚型 foot)。。。而这种风格类别的改变是相对频繁的。那么我们可以通过抽象工厂解决。



以下是网页生成器的类图:
            

 注意gof 抽象工厂里产品的抽象是接口,我这里用到的是抽象类是考虑到head ,body ,foot 本身会涉及到一些自有的属性。

public    abstract   class  Abody
    
{
       
public virtual string Render()
       
{
           
return this.ToString();
       }

    }

  public   class  ClassicBody:Abody
    
{
       
public override string Render()
        
{
            
return this.ToString();
        }

    }

public    class  VogueBody:Abody
    
{
    }

   public   interface  IFactory
    
{
       AHead CreateHead();
       Abody CreateBody();
       Afoot CreateFoot();
    }

  public   class  VogueFactory : IFactory
    
{
        
public AHead CreateHead()
        
{
            
return new VogueHead();
        }

        
public Abody CreateBody()
        
{
            
return new VogueBody();
        }

        
public Afoot CreateFoot()
        
{
            
return new VogueFoot();
        }

    }


  public   class  ClassicFactory:IFactory
    
{

        
public AHead CreateHead()
        
{
            
return new ClassicHead();
        }

        
public Abody CreateBody()
        
{
            
return new ClassicBody();
        }

        
public Afoot CreateFoot()
        
{
            
return new ClassicFoot();
        }

    }


   protected   void  Page_Load( object  sender, EventArgs e)
        
{
            IFactory factory 
= new VogueFactory();
            
bool first = true;
            System.Text.StringBuilder sb 
= new System.Text.StringBuilder();
        l:
           sb.Append( factory.CreateHead().Render()).Append(
"<br>");
            sb.Append( factory.CreateBody().Render()).Append(
"<br>");
            sb.Append(  factory.CreateFoot().Render()).Append(
"<br>");
            Response.Write(sb.ToString());
            
if (first)
            
{
                factory 
= new ClassicFactory();
                sb 
= new System.Text.StringBuilder();
                first 
= false;
                
goto l;
            }

运行结果:
AbstractFactory.VogueHead
AbstractFactory.VogueBody
AbstractFactory.VogueFoot
AbstractFactory.ClassicHead
AbstractFactory.ClassicBody
AbstractFactory.ClassicFoot
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值