设计模式读书笔记(五)——工厂方法模式

来源:互联网 发布:mac chrome去广告插件 编辑:程序博客网 时间:2024/06/02 12:07

  一、动机

      1、 在软件系统中,经常面临着“某个对象”的创建工作;由于需求的变化,这个对象面临着剧烈的变化,但是它们却拥有比较稳定的接口;

      2、如何应对这种变化,如何提供一种“封装”机制隔离出“这个易变对象的变化”,从而保持系统中其他“依赖此对象的对象”不随着需求的变化而变化;

二、代码

AbstractCar.cs:

namespace FactoryMethod
{
    
/// <summary>
    
/// Car 的摘要说明。
    
/// </summary>

    public abstract class AbstractCar
    
{
        Enigee enigee;

        
public abstract void StarUp();
        
        
public abstract void Run();

        
public abstract void Turn(Direction direction);
        
        
public abstract void Stop();        
    }

}

 

CarFactory.cs:

namespace FactoryMethod
{
    
/// <summary>
    
/// CarFactory 的摘要说明。
    
/// </summary>

    public abstract class CarFactory
    
{
        
public AbstractCar CreateCar();        
    }

}

HongQiCar.cs:

namespace FactoryMethod
{
    
/// <summary>
    
/// HongQiCar 的摘要说明。
    
/// </summary>

    public class HongQiCar:AbstractCar
    
{
        
public override void StarUp()
        
{

        }

        
        
public override void Run()
        
{

        }


        
public override void Turn(Direction direction)
        
{

        }

        
        
public override void Stop()
        
{

        }

    }

}

HongQiCarFactory.cs:

namespace FactoryMethod
{
    
/// <summary>
    
/// HongQiCarFactory 的摘要说明。
    
/// </summary>

    public class HongQiCarFactory:CarFactory
    
{
        
        
public override AbstractCar CreateCar()
        
{
            
return new HongQiCar();

        }
        
    }

}

CarTestFramework.cs:

namespace FactoryMethod
{
    
/// <summary>
    
/// CarTestFramework 的摘要说明。
    
/// </summary>

    public class CarTestFramework
    
{
        
public void BuildTestContext(AbstractCar car)
        
{
            car.StarUp();
        }


        
public void DoTest(AbstractCar car)
        
{
            car.Run();
        }


        
public TestData GetTestData()
        
{
            
        }

    }

}

App.cs:

namespace FactoryMethod
{
    
/// <summary>
    
/// App 的摘要说明。
    
/// </summary>

    public class App
    
{
        
public void Main()
        
{
            CarTestFramework carTestFramework
=new CarTestFramework();
            carTestFramework.BuildTestContext(
new HongQiCarFactory());
        }


    }

}

三、代码分析

       这里我主要强调的是工厂方法模式主要是面临着“某个对象”变化时适用。

       也许大家会觉得抽象工厂模式、生成器模式与工厂方法模式非常相似,下面谈谈它们的不同之处:

        抽象工厂模式解决的是“系列对象”的需求变化;生成器模式解决的是“对象部分”的需求变化;工厂方法模式解决的是“单个对象”的需求变化。

       任何模式都有一个变化和不变的地方,应用模式就是要封装变化点,下面我列出这三种模式变化与不变的地方:

  抽象工厂模式 生成器模式 工厂方法模式 不变点 接口 整体接口(如房屋) 接口 变化点 系列对象 对象部分(如门、窗等) 单个对象

 

原创粉丝点击