在开发网站的时候,我们经常要用到Factory Method模式与Abstract Factory模式,但它们有很多相似之处,大家容易搞混,那它们到底有那些区别呢?

Factory Method模式:Factory Method模式使一个类的实例化延迟到子类,具体来讲,就是Factory Method模式将创建对象实例的责任转移到工厂类,也就是说在工厂类里面,定义对象的实例化。

Abstract Factory模式Abstract Factory模式是一系列对象的创建,所以在抽象工厂类里面要创建一系列的对象的实例化,而不是单个对象的实例化。 切记这一系列对象存在一定的联系。

演示代码一

大家知道数据库有 SQL数据库与甲骨文数据库,现实当中我们有时候需要变换不同的数据库访问 以下采用Factory Method模式做这个变换效果

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

namespace FactoryMethod
{
    
class Program
    
{
        
static void Main(string[] args)
        
{

            Sql test 
= (Sql)ManagerDatabase.Factory.Create();
            test.WriteDatabase(
"访问的是SQL数据库");

            
//Oracle test = (Oracle)ManagerDatabase.Factory.Create();
            
//test.WriteDatabase("访问的是Oracle数据库");
        }



        
public abstract class ManagerDatabase //采用什么数据库来访问
        {
            
public static DatabaseFactory Factory = new SqlFactory();//采用Sql数据库访问
            
//public static DatabaseFactory Factory = new OracleFactory();//采用甲骨文数据库访问
        }


        
public abstract class Database //数据库
        {
            
public abstract void WriteDatabase(string name);
        }


        
public class Sql : Database //SQL数据库
        {
            
public override void WriteDatabase(string name)
            
{
                Console.WriteLine(name);
            }

        }


        
public class Oracle : Database //甲骨文数据库
        {
            
public override void WriteDatabase(string name)
            
{
                Console.WriteLine(name);
            }

        }


        
public abstract class DatabaseFactory //数据库工厂
        {
            
public abstract Database Create();
        }


        
public class SqlFactory : DatabaseFactory //生产SQL数据库
        {
            
public override Database Create()
            
{
                
return new Sql();
            }

        }


        
public class OracleFactory : DatabaseFactory //生产甲骨文数据库
        {
            
public override Database Create()
            
{
                
return new Oracle();
            }

        }


    }

}



结果输出:访问的是SQL数据库


演示代码二

      大家都知道衣服 有纽扣 也有衣领, 纽扣 衣领这些小东西一般需要交给加工厂单独来制作,在这里我们假设在中国加工厂制作称为中国的衣服(中国制造),在美国加工厂制作称为美国的衣服(美国制造)。以下采用abstractFactory模式来演示。

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

namespace abstractFactory
{
    
class Program
    
{

        
public interface IButton //纽扣
        {
            
void Button();
        }


        
public interface ICollar//衣领
        {
            
void Collar();
        }


        
public class ChinaButton : IButton //中国纽扣
        {

            
public void Button()
            
{
                Console.WriteLine(
"中国的纽扣");
            }


        }


        
public class ChinaCollar : ICollar //中国衣领
        {

            
public void Collar()
            
{
                Console.WriteLine(
"中国的衣领");
            }


        }

        
public class USAButton : IButton //美国纽扣
        {

            
public void Button()
            
{
                Console.WriteLine(
"美国的纽扣");
            }


        }


        
public class USACollar : ICollar  //美国衣领
        {

            
public void Collar()
            
{
                Console.WriteLine(
"美国的衣领");
            }


        }



        
public interface IClothesFactory //衣服加工厂
        {
            IButton DoButton();
            ICollar DoCollar();
        }



        
public class ChinaFactory : IClothesFactory //中国的衣服加工厂 //切记是多个对象的实例化
        {
            
public IButton DoButton()
            
{
                
return new ChinaButton();
            }

            
public ICollar DoCollar()
            
{
                
return new ChinaCollar();
            }

        }



        
public class USAFactory : IClothesFactory//美国的衣服加工厂  切记是多个对象的实例化
        {
            
public IButton DoButton()
            
{
                
return new USAButton();
            }

            
public ICollar DoCollar()
            
{
                
return new USACollar();
            }

        }


        
public abstract class Manufacturing
        
{
            
public static IClothesFactory Factory = new ChinaFactory(); //中国制造
            
//public static IClothesFactory Factory = new USAFactory();//美国制造

        }


        
static void Main(string[] args)
        
{
            IButton cf 
= (IButton)Manufacturing.Factory.DoButton();
            ICollar af 
= (ICollar)Manufacturing.Factory.DoCollar();
            cf.Button();
//做纽扣
            af.Collar();//做衣领
            Console.Read();


        }

    }

}



结果输出:中国的纽扣
              中国的衣领





posted on 2007-10-01 18:06  萧佰刚  阅读(1756)  评论(0编辑  收藏  举报