设计模式学习笔记三——Abstract Factory模式

动机:实现一系列相互依赖对象的创建,通过封装系列对象创建来隔离对象创建和客户程序,从而能够灵活提供更多系列对象创建和系列对象间的切换,而不需要改变客户程序。

应用:多种风格软件界面控件的创建、对应多种数据库的多系列数据访问层对象的创建(比如Petshop中的数据访问层对象)。

场景:此处以ThinkPad系列产品的组装为例子。组装电脑程序(即客户)需要根据需要拿出不同系列ThinkPad(此处以T43和T60为例)部件(以CPU和主板为例)组装成ThinkPad。因为T43和T60的CPU系列接口不同,所以同一系列中的CPU和主板相互依赖,每次只能拿同一系列的CPU和主板进行组装。

Factory Method模式:Factory Method模式是Abstract Factory模式的特殊形式,它实现一个对象的创建,而Abstract Factory模式实现系列对象创建。如这里只涉及到多种CPU的创建,则变为了Factory Method模式。


结构

AbstractFactory模式结构图


代码实现

/*
* 产品CPU
*/

namespace  DesignPattern.AbstractFactory
{
    
public abstract class CPU
    
{
    }


    
public class T43CPU : CPU
    
{
    }


    
public class T60CPU : CPU
    
{
    }

}

/*
* 产品主板
*/

namespace  DesignPattern.AbstractFactory
{
    
public abstract class Mainboard
    
{
    }


    
public class T43Mainboard : Mainboard
    
{
    }


    
public class T60Mainboard : Mainboard
    
{
    }

}

/*
 * 不同ThinkPad系列相互依赖部件组成不同型号ThinkPad,此处忽略各种不同型号。
*/

namespace  DesignPattern.AbstractFactory
{
    
public class ThinkPad
    
{
        
public void Play()
        
{
        }

    }

}

/*
 * ThinkPad工厂,生产各型号ThinkPad部件
*/

namespace  DesignPattern.AbstractFactory
{
    
public abstract class ThinkPadFactory
    
{
        
public abstract CPU CreateCPU();
        
public abstract Mainboard CreateMainboard();
    }


    
public class T43Factory : ThinkPadFactory
    
{
        
public override CPU CreateCPU()
        
{
            
return new T43CPU();
        }


        
public override Mainboard CreateMainboard()
        
{
            
return new T43Mainboard();
        }

    }


    
public class T60Factory : ThinkPadFactory
    
{
        
public override CPU CreateCPU()
        
{
            
return new T60CPU();
        }


        
public override Mainboard CreateMainboard()
        
{
            
return new T60Mainboard();
        }

    }

}

/*
* 客户程序,从ThinkPad工厂中拿出所需系列部件进行组装。
*/

namespace  DesignPattern.AbstractFactory
{
    
public class ThinkPadAssembly
    
{
        
public static readonly ThinkPadAssembly Instanse = new ThinkPadAssembly();

        
public ThinkPad CreateThinkPad(string strThinkPadName)
        
{
            ThinkPadFactory thinkPadFactory 
= (ThinkPadFactory)Assembly.Load("DesignPattern.AbstractFactory").CreateInstance("DesignPattern.AbstractFactory" + "." + strThinkPadName + "Factory");
            CPU cpu 
= thinkPadFactory.CreateCPU();
            Mainboard mainboard 
= thinkPadFactory.CreateMainboard();

            
return Assemble(cpu, mainboard);
        }


        
private ThinkPad Assemble(CPU cpu, Mainboard mainboard)
        
{
            
// 组装并返回ThinkPad,此处简化各种型号的ThinkPad
            return new ThinkPad();
        }

    }

}

你可能感兴趣的:(abstract)