当前位置: 代码迷 >> C# >> 多谢各位大神,这是一个工厂例子,但是每个产品有特有的方法,如何改动才能减低实现类的耦合
  详细解决方案

多谢各位大神,这是一个工厂例子,但是每个产品有特有的方法,如何改动才能减低实现类的耦合

热度:208   发布时间:2016-05-05 02:55:29.0
谢谢各位大神,这是一个工厂例子,但是每个产品有特有的方法,怎么改动才能减低实现类的耦合

    public abstract class animal
    {
        public abstract void eat();
    }
    public class dog : animal
    {
        public string c1;
        public override void eat()
        {
            Console.Write("dog eat");
        }
        public void guid()
        {
            Console.Write("dog guid");
        }
    }
    public class cat : animal
    {
        public override void eat()
        {
            Console.Write("cat eat");
        }
        public void catchmouse()
        {
             Console.Write("cat catch_mouse");
        }
    }
    /// <summary>
    /// 抽象工厂接口
    /// </summary>
    interface animalfactory
    {
        animal createanimal();
    }

    public class dogfactory : animalfactory
    {
        public animal createanimal()
        {
            return new dog();
        }
    }
    public class catfactory : animalfactory
    {
        public animal createanimal()
        {
            return new cat();
        }
    }

    /// <summary>
    /// 实现类
    /// </summary>
    public class action
    {
        /// <summary>
        /// 主人喂养
        /// </summary>
        public void feed()
        {
            animalfactory afactory = new dogfactory();
            animalfactory afactory2 = new catfactory();
            animal dog1 = afactory.createanimal();
            animal cat1 = afactory2.createanimal();
            dog1.eat();
            cat1.eat();
        }
        /// <summary>
        /// 吃饱要干活了,要他们各自干各自的,如果这样上面的类都要让实现类知道,不是增加了耦合了吗??怎么改动才是最好的呢
        /// </summary>
        public void work()
        {
            dog dog1 = new dog();
            dog1.guid();
            cat cat1 = new cat();
            cat1.catchmouse();
        }
    }

------解决思路----------------------
工厂都不同,那你是工厂方法模式了啊,专有的行为算不上耦合吧
对于每种动物各自的行为,设计模式里面对这个有个原则叫接口最小化,你这里就需要增加接口
IDog{guid}
ICat{catchmouse}
然后通过接口将特定的行为暴露出来
其实这里工厂已经不能满足你的要求了
你可以通过命令或者外观来封装work这个指令(行为)
------解决思路----------------------
引用:

        /// <summary>
        /// 吃饱要干活了,要他们各自干各自的,如果这样上面的类都要让实现类知道,不是增加了耦合了吗??怎么改动才是最好的呢
        /// </summary>
        public void work()
        {
            dog dog1 = new dog();
            dog1.guid();
            cat cat1 = new cat();
            cat1.catchmouse();
        }
    }


如果你的 animal 都有一个 work 方法要继承的话,为什么不在父类上抽象出来?
  相关解决方案