智取设计模式之抽象工厂
2016-12-30 08:08
302 查看
一、简介
抽象工厂模式将一组对象的实现细节与它们的一般使用分离开来,它提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。
二、定义
抽象工厂模式的实质是“提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们具体的类”。
三、称呼
抽象工厂模式别名:Kit模式。
四、抽象工厂模式VS工厂模式
1.抽象工厂的工厂是类,而工厂模式的工厂是方法。
2.抽象工厂在于产品之间的抽象关系,所以至少要两个产品(这些产品必须相互是有关系或有依赖的),而工厂模式在于生成产品,不关注产品之间的关系,所以可以只生成一个产品。
3.抽象工厂的工厂类就做一件事情就是生产产品给客户端使用,绝不自己用。而工厂模式生产产品可以给系统、客户端使用,也可以自己本类使用。自己这个类除了这个工厂方法外,还能有其他功能性的方法。
五、优点
1.分离具体的类。抽象工厂模式可以帮助控制一个应用创建的对象的类。因为一个工厂封装创建产品对象的责任和过程,它将客户与类实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分离,不出现在客户端代码中。从而实现了高内聚低耦合的设计目的。
2.易于交换产品系列。因为抽象工厂创建了一个完整的产品系列,所以只需改变具体的工厂即可使用不同的产品配置。
3.利于产品的一致性。当一个系列中的产品对象被设计成一起工作时,一个应用只能使用同一个系列中的对象,这一点很重要。而抽象工厂很容易实现这一点。
六、缺点
1.难以扩展抽象工厂以生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。不能很好的支持开闭原则。
七、适用性
1.一个系统要独立于它的产品的创建、组合、和表示时。这对所有类型的工厂模式都很重要。
2.一个系统要由多个产品系列中的一个来配置时。
3.当要强调一系列相关的产品对象的设计以便进行联合使用。属于同一个产品类库的产品将在一起使用,这一约束必须在系统的设计中体现出来。
4.当提供一个产品类库,而只是想显示它们的接口而不是实现,客户端不依赖具体实现。
八、UML类图分析
九、C#部分代码演示
abstract class AbstractFactory
{
public abstract void CreateWeapon();
public abstract void CreateBullet();
}
class AK47Factory : AbstractFactory
{
public override void CreateBullet()
{
Ak47Bullet ak47Bullet = new Ak47Bullet();
ak47Bullet.Bullet();
}
public override void CreateWeapon()
{
Ak47Weapon ak47Weapon = new Ak47Weapon();
ak47Weapon.Weapon();
}
}
抽象工厂模式将一组对象的实现细节与它们的一般使用分离开来,它提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。
二、定义
抽象工厂模式的实质是“提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们具体的类”。
三、称呼
抽象工厂模式别名:Kit模式。
四、抽象工厂模式VS工厂模式
1.抽象工厂的工厂是类,而工厂模式的工厂是方法。
2.抽象工厂在于产品之间的抽象关系,所以至少要两个产品(这些产品必须相互是有关系或有依赖的),而工厂模式在于生成产品,不关注产品之间的关系,所以可以只生成一个产品。
3.抽象工厂的工厂类就做一件事情就是生产产品给客户端使用,绝不自己用。而工厂模式生产产品可以给系统、客户端使用,也可以自己本类使用。自己这个类除了这个工厂方法外,还能有其他功能性的方法。
五、优点
1.分离具体的类。抽象工厂模式可以帮助控制一个应用创建的对象的类。因为一个工厂封装创建产品对象的责任和过程,它将客户与类实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分离,不出现在客户端代码中。从而实现了高内聚低耦合的设计目的。
2.易于交换产品系列。因为抽象工厂创建了一个完整的产品系列,所以只需改变具体的工厂即可使用不同的产品配置。
3.利于产品的一致性。当一个系列中的产品对象被设计成一起工作时,一个应用只能使用同一个系列中的对象,这一点很重要。而抽象工厂很容易实现这一点。
六、缺点
1.难以扩展抽象工厂以生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。不能很好的支持开闭原则。
七、适用性
1.一个系统要独立于它的产品的创建、组合、和表示时。这对所有类型的工厂模式都很重要。
2.一个系统要由多个产品系列中的一个来配置时。
3.当要强调一系列相关的产品对象的设计以便进行联合使用。属于同一个产品类库的产品将在一起使用,这一约束必须在系统的设计中体现出来。
4.当提供一个产品类库,而只是想显示它们的接口而不是实现,客户端不依赖具体实现。
八、UML类图分析
九、C#部分代码演示
abstract class AbstractFactory
{
public abstract void CreateWeapon();
public abstract void CreateBullet();
}
class AK47Factory : AbstractFactory
{
public override void CreateBullet()
{
Ak47Bullet ak47Bullet = new Ak47Bullet();
ak47Bullet.Bullet();
}
public override void CreateWeapon()
{
Ak47Weapon ak47Weapon = new Ak47Weapon();
ak47Weapon.Weapon();
}
}
interface IWeapon { void Weapon(); } class Ak47Weapon : IWeapon { public void Weapon() { Console.WriteLine("----Ak47Weapon----"); } } interface IBullet { void Bullet(); } class Ak47Bullet : IBullet { public void Bullet() { Console.WriteLine("----Ak47Bullet----"); } }
static void Main(string[] args) { AbstractFactory ak47 = new AK47Factory(); ak47.CreateWeapon(); ak47.CreateBullet(); }
相关文章推荐
- 设计模式之抽象工厂
- 设计模式之Factory1(简单工厂,工厂方法,抽象工厂的比较)
- 程序员的偷懒 -- 设计模式之抽象工厂
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别【转】
- Abstract Factory 抽象工厂设计模式
- 设计模式 之 抽象工厂
- AbstractFactory抽象工厂设计模式
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别 (转)
- 抽象工厂设计模式(C#)
- 设计模式--创建模式--抽象工厂
- Net框架中的设计模式之Builder(构造者)--兼谈抽象工厂和composite模式
- 换个角度学习设计模式-抽象工厂
- AbstractFactory抽象工厂设计模式
- 设计模式之抽象工厂--(你收到信息了吗?)含源代码
- 设计模式笔记--创建型模式之一 抽象工厂
- Net框架中的设计模式之Builder(构造者)--兼谈抽象工厂和composite模式
- Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂
- 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别
- 抽象工厂与建造设计模式结合