抽象工厂模式 The Abstract Factory Pattern
2008-06-23 18:02
549 查看
抽象工厂模式——提供一个接口,用于创建相关或依赖对家的家族,而不需要明确指定具体类。(摘自《Head First Design Patterns》)
以下是自已用VS画了一个简图:
创建抽象工厂接口:
实现二个属性工厂:
创建武器基类,含有一个属性工厂:
实现二个武器:
开始测试抽象工厂:
测试中分别创建了一级和二级属性工厂,在实例化武器时把工厂加入,不同的工厂就产生了不同的效果,输出结果:
这是一把剑,附加了1级风属性 1级冰属性
这是一把剑,附加了2级风属性 2级冰属性
这是一把斧子,附加了1级火属性 1级冰属性
这是一把斧子,附加了2级火属性 2级冰属性
简单的抽象工厂至此介绍完毕,下面结合一下工厂方法模式:
创建一个武器工厂基类,含有一个属性工厂:
实现一个普通工厂和一个超级工厂,超级工厂又多含有一个属性工厂,以便能生产不同级别的武器:
接下来用新的工厂来生产武器:
普通工厂只能生产一级武器,而超级工厂能生产一级和二级武器,输出结果:
这是一把剑,附加了1级风属性 1级冰属性
这是一把斧子,附加了1级火属性 1级冰属性
这是一把剑,附加了2级风属性 2级冰属性
这是一把斧子,附加了2级火属性 2级冰属性
这是一把剑,附加了1级风属性 1级冰属性
这是一把斧子,附加了1级火属性 1级冰属性
工厂方法模式和抽象工厂结合就产生了这样的效果,有阐述的不对之处,还请大家指出。
以下是自已用VS画了一个简图:
创建抽象工厂接口:
public interface IPropertyFactory { string CreateIce(); string CreateFire(); string CreateWind(); }
实现二个属性工厂:
class Level1Factory : IPropertyFactory { #region IPropertyFactory 成员 public string CreateIce() { return "1级冰属性"; } public string CreateFire() { return "1级火属性"; } public string CreateWind() { return "1级风属性"; } #endregion } class Level2Factory : IPropertyFactory { #region IPropertyFactory 成员 public string CreateIce() { return "2级冰属性"; } public string CreateFire() { return "2级火属性"; } public string CreateWind() { return "2级风属性"; } #endregion }
创建武器基类,含有一个属性工厂:
public abstract class Weapon { protected string Name = string.Empty; protected string Property = string.Empty; protected IPropertyFactory PropertyFactory; protected abstract void Process(); public void Show() { Process(); Console.WriteLine(string.Format("这是一把{0},附加了{1}", Name, Property)); } }
实现二个武器:
class Sword : Weapon { public Sword(IPropertyFactory factory) { this.PropertyFactory = factory; } protected override void Process() { this.Name = "剑"; this.Property = string.Format("{0} {1}", this.PropertyFactory.CreateWind(), this.PropertyFactory.CreateIce()); } } class Axe : Weapon { public Axe(IPropertyFactory factory) { this.PropertyFactory = factory; } protected override void Process() { this.Name = "斧子"; this.Property = string.Format("{0} {1}", this.PropertyFactory.CreateFire(), this.PropertyFactory.CreateIce()); } }
开始测试抽象工厂:
IPropertyFactory level1Factory = new Level1Factory(); IPropertyFactory level2Factory = new Level2Factory(); Weapon sword1 = new Sword(level1Factory); Weapon sword2 = new Sword(level2Factory); sword1.Show(); sword2.Show(); Weapon axe1 = new Axe(level1Factory); Weapon axe2 = new Axe(level2Factory); axe1.Show(); axe2.Show();
测试中分别创建了一级和二级属性工厂,在实例化武器时把工厂加入,不同的工厂就产生了不同的效果,输出结果:
这是一把剑,附加了1级风属性 1级冰属性
这是一把剑,附加了2级风属性 2级冰属性
这是一把斧子,附加了1级火属性 1级冰属性
这是一把斧子,附加了2级火属性 2级冰属性
简单的抽象工厂至此介绍完毕,下面结合一下工厂方法模式:
创建一个武器工厂基类,含有一个属性工厂:
public abstract class WeaponFactory { protected IPropertyFactory PropertyFactory; public abstract Weapon CreateWeapon(string typeName); }
实现一个普通工厂和一个超级工厂,超级工厂又多含有一个属性工厂,以便能生产不同级别的武器:
class NormalFactory : WeaponFactory { public NormalFactory() { this.PropertyFactory = new Level1Factory(); } public override Weapon CreateWeapon(string typeName) { switch (typeName) { case "sword": return new Sword(this.PropertyFactory); case "axe": return new Axe(this.PropertyFactory); } return null; } } class SuperFactory : WeaponFactory { protected IPropertyFactory PropertyFactory2; public SuperFactory() { this.PropertyFactory = new Level1Factory(); this.PropertyFactory2 = new Level2Factory(); } public override Weapon CreateWeapon(string typeName) { switch (typeName) { case "sword": return new Sword(this.PropertyFactory); case "supersword": return new Sword(this.PropertyFactory2); case "axe": return new Axe(this.PropertyFactory); case "superaxe": return new Axe(this.PropertyFactory2); } return null; } }
接下来用新的工厂来生产武器:
WeaponFactory normalFactory = new NormalFactory(); WeaponFactory superFactory = new SuperFactory(); //使用普通工厂 Weapon sword = normalFactory.CreateWeapon("sword"); Weapon axe = normalFactory.CreateWeapon("axe"); sword.Show(); axe.Show(); //使用超级工厂 Weapon superSword = superFactory.CreateWeapon("supersword"); Weapon superAxe = superFactory.CreateWeapon("superaxe"); superSword.Show(); superAxe.Show(); //超级工厂能创建普通工厂的产品 Weapon normalSword = superFactory.CreateWeapon("sword"); Weapon normalAxe = superFactory.CreateWeapon("axe"); normalSword.Show(); normalAxe.Show();
普通工厂只能生产一级武器,而超级工厂能生产一级和二级武器,输出结果:
这是一把剑,附加了1级风属性 1级冰属性
这是一把斧子,附加了1级火属性 1级冰属性
这是一把剑,附加了2级风属性 2级冰属性
这是一把斧子,附加了2级火属性 2级冰属性
这是一把剑,附加了1级风属性 1级冰属性
这是一把斧子,附加了1级火属性 1级冰属性
工厂方法模式和抽象工厂结合就产生了这样的效果,有阐述的不对之处,还请大家指出。
相关文章推荐
- 抽象工厂模式 The Abstract Factory Pattern
- c++设计模式:抽象工厂模式(Abstract Factory Pattern)
- 设计模式------抽象工厂模式(AbstractFactoryPattern)
- Java设计模式——创建型模式——抽象工厂模式(Abstract Factory Pattern)
- 设计模式(创建型)之抽象工厂模式(Abstract Factory Pattern)
- 设计模式(3):抽象工厂模式(Abstract Factory Pattern)
- 抽象工厂模式(Abstract Factory Pattern)
- Python实现设计模式--03.抽象工厂模式(Abstract Factory Pattern)
- 设计模式-抽象工厂模式(abstractFactory pattern)
- 设计模式--2: Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)
- 创建型模式——抽象工厂模式(Abstract Factory Pattern)
- 我所理解的设计模式(C++实现)——抽象工厂模式(Abstract Factory Pattern)
- Net设计模式之抽象工厂模式(Abstract Factory Pattern)(2) 推荐
- Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)
- 设计模式3:Abstract Factory Pattern(抽象工厂模式)
- 抽象工厂模式(Abstract Factory Pattern)
- 设计模式(三)抽象工厂模式(Abstract Factory Pattern)
- 抽象工厂模式(Abstract Factory Pattern)
- AbstractFactory Pattern(抽象工厂模式)
- Applying Abstract Factory Pattern: the Loki Way