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

wymen11 2015-09-15 10:02:55

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();
}
}
...全文
109 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sp1234_maJia 2015-09-15
  • 打赏
  • 举报
回复
在你这个问题中,纠结什么“工厂”这个词儿根本就是无关的标题党式的话。 你的animal 到底要不要有一个通用的 work 接口方法?在本来就是一句话就能回答的问题! 为什么要在标题上扯上“工厂例子、抽象工厂”的名词儿呢?是什么习惯造成了你用一个“面向纯粹计算机软件的术语”来搞乱最基本的“面向领域应用的基本功能”的设计呢?
  • 打赏
  • 举报
回复
你先说“animal 只有 eat”才做,在你的概念中 animal 根本没有 work 的行为,然后你又说“在work中 animal 最好有统一的 work”,其实这是很简单很幼稚的一个语言问题,这是你再问自己为什么归纳animal 的抽象方法接口时忘记了 work 通用方法的问题。这类问题,往往就被各种雷人的模式名词儿给歪曲了,干扰了一个人最基本的逻辑判断。 软件设计不是标题党。不要空谈 animal 有什么属性、方法的问题。你先假设 animal 就不能有 work 抽象方法,然后又来问“为什么不能有统一的 work 方法”,谁能回答呀?只有你自己。 软件是人为设计的,本来很容易与现实进行映射。抽象必定是从具体中进行重构的结果,架构必定是几天就改变一次,这是很正常的事儿。费了很大劲来了解OO概念,就是避免被各种“雷人的”模式名词所干扰你的设计思路,而用最基本、最直接了当的OO概念说明白问题就足够了。你想要animal 有一个统一的 work 接口方法好去低耦合地访问,那么你就可以重构你的animal的设计。修正 animal 类型定义的很正常的过程,没有什么稀奇的,不是非得学一堆雷人的名词儿才知道要给 animal 重构上 work 通用接口方法的。
  • 打赏
  • 举报
回复
另外,软件设计不是标题党。不要空谈 animal 有什么属性、方法的问题。软件是人为设计的,本来很容易与现实进行映射。抽象必定是从具体中进行重构的结果,架构必定是几天就改变一次,这是很正常的事儿。费了很大劲来了解OO概念,就是避免被各种“雷人的”模式名词所干扰你的设计思路,而用最基本、最直接了当的OO概念说明白问题就足够了。 你的 work 难道是”上帝“的活动吗?它没有接口、抽象的概念。它内部的流程,你想要animal 有一个统一的 work 接口方法好去低耦合地访问,那么你就可以重构你的animal的设计。这是修正 animal 类型定义的很正常的过程,没有什么稀奇的,是可以重构的。
  • 打赏
  • 举报
回复
引用 楼主 cwm1985 的回复:

        /// <summary>
        /// 吃饱要干活了,要他们各自干各自的,如果这样上面的类都要让实现类知道,不是增加了耦合了吗??怎么改动才是最好的呢
        /// </summary>
        public void work()
        {
            dog dog1 = new dog();
            dog1.guid();
            cat cat1 = new cat();
            cat1.catchmouse();
        }
    }
如果你的 animal 都有一个 work 方法要继承的话,为什么不在父类上抽象出来?
  • 打赏
  • 举报
回复
工厂都不同,那你是工厂方法模式了啊,专有的行为算不上耦合吧
对于每种动物各自的行为,设计模式里面对这个有个原则叫接口最小化,你这里就需要增加接口
IDog{guid}
ICat{catchmouse}
然后通过接口将特定的行为暴露出来
其实这里工厂已经不能满足你的要求了
你可以通过命令或者外观来封装work这个指令(行为)

110,526

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧