设计模式学习笔记之 Factory
Factory 模式用来在创建一种经常发生变化,却有稳定接口的对象时使用。它隔离了对象的使用者和具体实现者,避免了传统模式下的使用者和具体实现者之间的紧耦合关系,较大程度的避免了对象发生变化时造成的软件的脆弱。
下面举一个测验的例子,每科课程都有自己的测验,每种测验又包括选择题和问答题两种:
public abstract class AbstractQuiz //Quiz的笔试部分
{
public abstract void EssayQuestion(); //E文不好 不知道对不对;
public abstract void ChoiceQuestion(); //见笑了;
}
所有的测试都继承自此抽象类,例如数学测试:
public class MathQuiz : AbstractQuiz
{
public override void EssayQuestion()
{
}
public override void ChoiceQuestion()
{
}
}
但此时并未解决使用者和具体实现之间的耦合关系,于是使用Factory
public abstract class QuizFactory
{
public abstract AbstractQuiz CreatQuiz();
}
所有的测试的Factory都继承自此抽象类,继续数学测试例子:
public class MathQuizFactory : QuizFactory
{
public override AbstractQuiz CreatQuiz()
{
return new MathQuiz();
}
}
下面是使用数学测试的例子
public class QuizManager
{
public void DoQuiz(QuizFactory quizFactory)
{
AbstractQuiz quiz = quizFactory.CreatQuiz();
}
}
DoQuiz的参数是QuizFactory类型的,当使用数学测试时
QuizManager myManager = new QuizManager();
myManager.DoQuiz(new MathQuizFactory());
现在我们又需要英语测试了,那就这样
public class EnglishQuiz : AbstractQuiz
{
public override void EssayQuestion()
{
}
public override void ChoiceQuestion()
{
}
}
public class EnglishQuizFactory : QuizFactory
{
public override AbstractQuiz CreatQuiz()
{
return new EnglishQuiz();
}
}
然后给QuizManager.DoQuiz()传个EnglishQuizFactory就OK了。
前面提到的Abstract Factory模式就是Factory模式的一个演化。在Abstract Factory模式中,Factory里都包括数个对象,这些对象是成系列出现的,而且是相互关联的,这一点可以与Factory模式来区别。如果现在在Quiz这个需求中又出现了Quiz的面试部分,而且这部分和笔试部分有很强的联系,例如让你讲解自己的Quiz笔试,那么这两部分就是成系列出现的了,而且又是相互关联的,那么Factory就演变成Abstract Factory了。
参考 MSDNWebCast C#设计模式纵横谈 李建忠


浙公网安备 33010602011771号