在开发网站的时候,我们经常要用到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();
}
}
}
}
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();
}
}
}
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();
}
}
}
结果输出:中国的纽扣
中国的衣领