为了区分Factory Method和Abstract Factory的区别,查阅了些资料,总算有点感悟,下面是本人的感悟的总结。

在设计模式中,Factory Method和Abstract Factory的区别并不容易理解,主要是Abstrct Factory一般情况下是要通过Factory Method来实现,或者说Abstract Factory包含Factroy Method。

从字面上来理解,Factory Method强调的是Method,Abstract Factory强调的是抽象类,也就是继承关系。

下面,将使用例子来对比Factory Method和Abstract Factory。

有两种不同的产品,分别是电视和收音机,下面分别用Factory Method和Abstract Factory模式对两种产品进行创建。

(1)  Factory Method模式主要通过工厂类的方法的多态来实现对多种不同产品的创建。其C#示例代码如下所示。

namespace FactoryMethod
{
class Program
{
public interface IProduct
{
void ProductName();
}

public class CRadio : IProduct
{
public void ProductName()
{
Console.WriteLine(
"Radio");
}
}

public class CTV : IProduct
{
public void ProductName()
{
Console.WriteLine(
"TV");
}
}

public interface IFactory
{
IProduct CreateProduct(
string ProductName);
}

public class CConcreteFactory
{
public IProduct CreateProduct(string ProductName)
{
if (0 == ProductName.CompareTo("TV"))
{
return new CTV();
}
else
{
return new CRadio();
}
}
}

static void Main(string[] args)
{
CConcreteFactory ConFactory
= new CConcreteFactory();
IProduct TVProduct
= ConFactory.CreateProduct("TV");
TVProduct.ProductName();

IProduct RadioProduct
= ConFactory.CreateProduct("Radio");
RadioProduct.ProductName();

Console.Read();
}
}
}

(2) AbstractFactory模式主要是通过工厂类的不同的子类来实现不同类别的产品的创建。其C#示例代码如下所示:

namespace AbstractFactory
{
class Program
{
public interface IProduct
{
void ProductName();
}

public class CRadio : IProduct
{
public void ProductName()
{
Console.WriteLine(
"Radio");
}
}

public class CTV : IProduct
{
public void ProductName()
{
Console.WriteLine(
"TV");
}
}

public interface IFactory
{
IProduct CreateProduct(
string ProductName);
}

public class CRadioFactory
{
public IProduct CreateProduct()
{
return new CRadio();
}
}

public class CTVFactory
{
public IProduct CreateProduct()
{
return new CTV();
}
}

static void Main(string[] args)
{
CTVFactory TVFactory
= new CTVFactory();
IProduct TVProduct
= TVFactory.CreateProduct();
TVProduct.ProductName();

CRadioFactory RadioFactory
= new CRadioFactory();
IProduct RadioProduct
= RadioFactory.CreateProduct();
RadioProduct.ProductName();

Console.Read();
}
}
}

 

 

posted on 2011-05-29 22:22  闲云鹤  阅读(1541)  评论(0编辑  收藏  举报