用户操作
[即时聊天] [发私信] [加为好友]
乐可乐可ID:lihui_830501
2034次访问,排名2万外,好友1人,关注者3人。
学无止境
lihui_830501的文章
原创 14 篇
翻译 0 篇
转载 0 篇
评论 24 篇
最近评论
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 抽象工厂模式 The Abstract Factory Pattern收藏

    新一篇: 单件模式 The Singleton Pattern | 旧一篇: 工厂方法模式 The Factory Method Pattern

           抽象工厂模式——提供一个接口,用于创建相关或依赖对家的家族,而不需要明确指定具体类。(摘自《Head First Design Patterns》)      
    以下是自已用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级冰属性
    工厂方法模式和抽象工厂结合就产生了这样的效果,有阐述的不对之处,还请大家指出。
                

    发表于 @ 2008年06月23日 18:02:00|评论(loading...)|收藏

    新一篇: 单件模式 The Singleton Pattern | 旧一篇: 工厂方法模式 The Factory Method Pattern

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 乐可乐可