随笔 - 54  文章 - 2 评论 - 79 阅读 - 69803
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

设计模式学习笔记之 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#设计模式纵横谈    李建忠

     回到目录
 

posted on   aiya  阅读(295)  评论(1编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示