关闭

C# 设计模式 之 工厂方法

1123人阅读 评论(0) 收藏 举报

 

    为了对一个类进行实例化,通常使用这个类的构成函数,但是有时候出现这类情况:几个类实现了同一个接口,具有同样的操作、返回了同样的抽象类型,不知道该为哪个类型创建对象,因为需要根据条件来控制对哪个类进行实例化,并且此时类的数量可能增减,接口却是稳定的。我们需要工厂方法模式!
   

       我们遇见一个.NET中的经典实例就是枚举器。Enumerator的 GetEnumerator()的方法是一个用了工厂方法模式的例子。这个方法将调用者与需要进行实例化的类隔离开来了。

       需要指出的是并不是能够创建并返回一个对象的方法都是工厂方法。工厂方法模式需要包括一个方法,这个方法创建并返回一个对象,同时客户无需要了解应该具体去实例化哪个类。

      我们再看另外一个例子:  

using System;
using System.Collections.Generic;
using System.Text;

namespace FactoryMethod
{
    
/// <summary>
    
/// 机器
    
/// </summary>

    public abstract class Machine
    
{
        
public abstract void Print();
    }


    
///<summary>
    
/// 打印机
    
/// </summary>

    public class Printer : Machine
    
{
        
public override void Print()
        
{
            Console.WriteLine(
"Printer");
        }

    }


    
///<summary>
    
/// 复印机
    
/// </summary>

    public class Copycat : Machine
    
{
        
public override void Print()
        
{
            Console.WriteLine(
"Copycat");
        }

    }


    
/// <summary>
    
/// MachineFactory 类
    
/// </summary>

    public abstract class MachineFactory
    
{
        
public abstract Machine Create();
    }


    
/// <summary>
    
/// PrinterFactory 类
    
/// </summary>

    public class PrinterFactory : MachineFactory
    
{
        
public override Machine Create()
        
{
            
return new Printer();
        }

    }


    
/// <summary>
    
/// CopycatFactory 类
    
/// </summary>

    public class CopycatFactory : MachineFactory
    
{
        
public override Machine Create()
        
{
            
return new Copycat();
        }

    }


    
class Program
    
{
        
static void Main(string[] args)
        
{
            MachineFactory factory 
= null;
            
//根据条件判断创建哪个对象
            bool conditon = true;
            
if (conditon)
            
{
                factory 
= new PrinterFactory();
            }

            
else
            
{
                factory 
= new CopycatFactory();
            }

            Machine machine 
= factory.Create();
            machine.Print();
            Console.ReadLine();
        }

    }

}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:478788次
    • 积分:4592
    • 等级:
    • 排名:第6392名
    • 原创:73篇
    • 转载:6篇
    • 译文:0篇
    • 评论:184条
    最新评论