设计模式C#描述——抽象工厂模式
2008-05-01 02:53
537 查看
设计模式C#描述——抽象工厂模式
阅读此文应先阅读简单工厂模式与工厂方法模式
抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广。
假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构。那么为了将消费这些产品对象的责任和创建这些产品对象的责任分开,可以引进抽象工厂模式。这样的话,消费产品的客户不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品。
采用抽象工厂模式设计出的系统类图如下。
从上图可以看到,抽象工厂模式设计到以下的角色:
抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用接口或抽象类实现。
具体工厂角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。通常使用具体的类实现。
抽象产品角色:担任这个角色的类是抽象工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用接口或抽象类实现这一角色。
具体产品角色:抽象工厂模式所创建的任何产品对象都是某一具体产品类的实例。这是客户端最终需要的东西。通常使用具体类实现这个角色。
下面给出这个系统的原代码:
Creator:
public interface Creator
{
ProductA factoryA();
ProductB factoryB();
}
ConcreteCreator1:
public class ConcreteCreator1:Creator
{
public ProductA factoryA()
{
return new ProductA1();
}
public ProductB factoryB()
{
return new ProductB1();
}
}
ConcreteCreator2:
public class ConcreteCreator2:Creator
{
public ProductA factoryA()
{
return new ProductA2();
}
public ProductB factoryB()
{
return new ProductB2();
}
}
ProductA:
public interface ProductA
{
}
ProductA1:
public class ProductA1:ProductA
{
public ProductA1()
{
}
}
ProductA2:
public class ProductA2:ProductA
{
public ProductA2()
{
}
}
ProductB:
public interface ProductB
{
}
ProductB1:
public class ProductB1:ProductB
{
public ProductB1()
{
}
}
ProductB2:
public class ProductB2:ProductB
{
public ProductB2()
{
}
}
在以下情况下应该使用抽象工厂模式:
一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依
阅读此文应先阅读简单工厂模式与工厂方法模式
抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广。
假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构。那么为了将消费这些产品对象的责任和创建这些产品对象的责任分开,可以引进抽象工厂模式。这样的话,消费产品的客户不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品。
采用抽象工厂模式设计出的系统类图如下。
从上图可以看到,抽象工厂模式设计到以下的角色:
抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用接口或抽象类实现。
具体工厂角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。通常使用具体的类实现。
抽象产品角色:担任这个角色的类是抽象工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用接口或抽象类实现这一角色。
具体产品角色:抽象工厂模式所创建的任何产品对象都是某一具体产品类的实例。这是客户端最终需要的东西。通常使用具体类实现这个角色。
下面给出这个系统的原代码:
Creator:
public interface Creator
{
ProductA factoryA();
ProductB factoryB();
}
ConcreteCreator1:
public class ConcreteCreator1:Creator
{
public ProductA factoryA()
{
return new ProductA1();
}
public ProductB factoryB()
{
return new ProductB1();
}
}
ConcreteCreator2:
public class ConcreteCreator2:Creator
{
public ProductA factoryA()
{
return new ProductA2();
}
public ProductB factoryB()
{
return new ProductB2();
}
}
ProductA:
public interface ProductA
{
}
ProductA1:
public class ProductA1:ProductA
{
public ProductA1()
{
}
}
ProductA2:
public class ProductA2:ProductA
{
public ProductA2()
{
}
}
ProductB:
public interface ProductB
{
}
ProductB1:
public class ProductB1:ProductB
{
public ProductB1()
{
}
}
ProductB2:
public class ProductB2:ProductB
{
public ProductB2()
{
}
}
在以下情况下应该使用抽象工厂模式:
一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依
相关文章推荐
- 设计模式c#语言描述——适配器模式
- 设计模式c#语言描述——合成(Composite)模式
- 设计模式C#描述——抽象工厂模式
- 设计模式C#描述之——简单工厂模式、抽象工厂模式、单例与多例模式
- 设计模式C#描述之——简单工厂模式、抽象工厂模式、单例与多例模式
- 设计模式C#描述——抽象工厂模式
- 设计模式C#描述——抽象工厂模式
- 【转】设计模式C#描述——抽象工厂模式
- 设计模式C#描述——抽象工厂模式
- 设计模式C#描述——抽象工厂模式
- 设计模式C#描述——抽象工厂模式
- 设计模式C#描述之——简单工厂模式
- 设计模式-抽象工厂模式(C#)
- 设计模式c#语言描述——合成(Composite)模式
- 设计模式、用Delphi描述-->Factory Method模式
- 201802132228->深入浅出设计模式:c#抽象工厂模式
- [导入]C#面向对象设计模式纵横谈(4):Abstract Factory 抽象工厂模式(创建型模式)
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
- 设计模式c#语言描述——建造者模式、适配器模式、合成(Composite)模式