设计模式学习工厂方法模式

在C#中应用工厂模式

工厂方法模式来自于创建模式的分类,创建模式是最好的处置创建对象的方式,工厂方法提供了一个简单的
决策,该决策得出了这样一个类,该类能够返回一个抽象基类的几个子类的对象,这里抽象基类以来与提供的
信息.

"为每一个创建的对象定义一个接口,但是让子类决定由哪个类去初始化,工厂方法让一个类遵从子类的指令去初始
化."   --"设计模式"  Gamma et al., Addison-Wesley, ISBN:0-201-63361-2" 

非软件实例

喷射模型展示了这种模式, 朔料玩具厂处理熟料模型粉末,并且喷射朔料到设计好造型的模子里, 这个玩具类被
模子决定了,

一个工厂模型是一个返回几个可能的类之一的一个实例,这几个可能的类依赖于提供给它们的数据,一般来讲,
所有的类都应该有一个通用的基类和通用的方法,但是方法的实现可能不同.

下面的 UML 表示了工厂方法模式,在这个例子中,我们没有直接创建类Derived1 和Derived2 ,而是使用
工厂类的 getObject() 方法,根据传递的参数去返回一个合适的实例.这样的方法一般叫做工厂方法.工厂
方法可以是静态的也可以是非静态的.



C#中实现工厂方法:

    //Creational Pattern: The Factory Method
    
//In Factory method pattern, 
    
//A Factory class contains a factory method is used for creating the object. 
    
//This factory method can be either static or non-static.

    
class Factory
    
{
        
public Base GetObject(int type)
        
{
            Base base1 
= null;
            
switch (type)
            
{
                
case 1:
                    base1 
= new Derived1();
                    
break;
                
case 2:
                    base1 
= new Derived2();
                    
break;
            }

            
return base1;
        }

    }

    
interface Base
    
{
        
void DoIt();
    }

    
class Derived1 : Base
    
{
        
public void DoIt()
        
{
            Console.WriteLine(
"Derived 1 method");
        }

    }

    
class Derived2 : Base
    
{
        
public void DoIt()
        
{
            Console.WriteLine(
"Derived 2 method");
        }

    }

    
//--------Client class----------
    
//Client class needn't know about instance creation. 
    
//The creation of Product is 
    
//deferred to the Factory class
    class MyClient
    
{
        
public static void Main()
        
{
            Factory factory 
= new Factory();//Decides which object must create.
            Base obj = factory.GetObject(2);
            obj.DoIt();
        }

    }

这就是工厂方法的基本规则, 我们创建了一个抽象,这个抽象决定了哪几个可能的类被返回, 并且返回一个.之后
我们就能够调用类实例的方法,甚至不需要实际上在使用被继承类是哪一个,对象的建立发生在工厂类内的一个
单独的地方.

记住工厂类可以包含很多个工厂方法,甚至这些工厂方法能够是静态或者非静态.


原文地址:https://www.cnblogs.com/flyinthesky/p/1218500.html