`

设计模式学习笔记四:工厂方法(Factory Method)

    博客分类:
  • .Net
阅读更多

1.概述
    在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。如何应对这种变化?提供一种封装机制来隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变?这就是要说的Factory Method模式了。
    工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化那个类。工厂方法使一个类的实例化延迟到其子类。这个借口所指的是一个抽象方法,该方法说明需要创建一个对象,但并不给出具体的的创建方法和创建什么类型的对象。
    工厂方法的使用场合:当一个类不知道他所必须创建对象的类或一个类希望由子类来指定他所创建的对象时,可以使用工厂方法。
    工厂方法模式结构图:

     图中表示表示工厂方法的部分只是FactoryMethod()。在Creator中定义这个方法的接口,在ConcreteProduct中实现这个方法。如果没有这个方法就没有工厂方法模式。Creator的职责并非只是创建一个产品,他经常同是包含有模板方法,及模式仅限于方法部分,这也就是为什么叫做“工厂方法”的原因。
    工厂方法使类中的代码不依赖于他必须创建的类,代码只要知道他需要创建类的接口。工厂方法的缺点是新增加一个需要创建的类,就需要增加一个相应的子类。
    2.实例  
    1)大话设计模式中的计算器工厂方法模式实现
    计算器的工厂方法模式实现结构图如下图:

 
        代码:
        Operation基类:
        
Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->  public abstract class Operation
    
{
        
private double _numbleA = 0;
        
private double _numbleB = 0;

        
public double NumbleA
        
{
            
get return _numbleA; }
            
set { _numbleA = value; }
        }


        
public double NumbleB
        
{
            
get return _numbleB; }
            
set { _numbleB = value; }
        }


        
public virtual double GetResult()
        
{
            
double Result = 0;
            
return Result;
        }

    }

三个子类:
Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->public class OperationAdd : Operation
    
{
        
public override double GetResult()
        
{
            
double Result = 0;
            Result 
= NumbleA + NumbleB;
            
return Result;
        }

    }

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    public class OperationMul : Operation
    
{
        
public override double GetResult()
        
{
            
double Result = 0;
            Result 
= NumbleA + NumbleB;
            
return Result;
        }

    }

 

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> public class OprationSub : Operation
    
{
        
public override double GetResult()
        
{
            
double Result = 0;
            Result 
= NumbleA + NumbleB;
            
return Result;
        }

    }


抽象工厂方法:

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->  public abstract class OperationFactory
    
{
        
public abstract Operation CreateOpreation();
    }

三个具体工厂方法:

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> public class AddFactory : OperationFactory
    
{
        
public override Operation CreateOpreation()
        
{
            
return new OperationAdd();
        }

    }

 

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    public class MulFactory : OperationFactory
    
{

        
public override Operation CreateOpreation()
        
{
            
return new OperationMul();
        }

    }

 

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    public class SubFactory : OperationFactory
    
{
        
public override Operation CreateOpreation()
        
{
            
return new OprationSub();
        }

    }


客户端的实现:

Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->        static void Main(string[] args)
        
{
            OperationFactory operFactory 
= new AddFactory();
            Operation oper 
= operFactory.CreateOpreation();
            oper.NumbleA 
= 5;
            oper.NumbleB 
= 4;
            
double result = oper.GetResult();
            Console.WriteLine(
"结果:{0}",result);
            Console.ReadLine();
        }

    3.总结
    工厂方法模式与简单工厂模式再结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了"开放-封闭"原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。工厂方法模式退化后可以演变成简单工厂模式。工厂方法模式退化后可以演变成简单工厂模式。
    适用于工厂方法模式:  当一个类不知道它所必须创建的对象的类的时候;当一个类希望由它的子类来指定它所创建的对象的时候;当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
    工厂方法克服了简单工厂违背开放封闭原则的缺点,又保持了分装对象创建过程的优点,工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了他的缺点。缺点就是由于每增加一个产品,就需要加一个产品工厂类。

分享到:
评论

相关推荐

    设计模式学习笔记大全

    以上就是压缩包中的设计模式学习笔记涉及到的主要内容。通过对这些模式的理解和应用,开发者可以更好地解决软件设计中的问题,提升软件的质量和可维护性。每种模式都有其适用场景,理解其背后的意图和应用场景是关键...

    设计模式学习笔记总结

    这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...

    设计模式学习笔记

    2. 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪个类。 3. 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 4. ...

    GoF 23种设计模式学习笔记

    "GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    23中设计模式学习笔记.docx

    ### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...

    300Java设计模式部分学习笔记

    以下是一些在尚学堂300Java设计模式部分学习笔记中涉及的设计模式的知识点: 创建型模式: 创建型模式主要解决对象创建的问题,确保系统的灵活性和封装创建细节。学习笔记中提到了5种创建型模式: 1. 单例模式...

    图解java设计模式_学习笔记_java开发

    这份"图解java设计模式_学习笔记"是针对Java开发者深入理解和应用设计模式的重要资源。在这里,我们将深入探讨Java设计模式的核心概念、分类以及它们在实际开发中的应用。 设计模式分为三大类:创建型、结构型和...

    《设计模式》学习笔记

    ### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...

    结城浩《图解设计模式》笔记

    本笔记主要讲述了设计模式的基本概念和应用,包括 Iterator 模式、Adapter 模式、TemplateMethod 模式、FactoryMethod 模式和 Singleton 模式等。通过对这些设计模式的详细解释和示例代码的分析,我们可以更好地理解...

    《设计模式:可复用面向对象软件的基础》学习并理解 23 种设计模式

    - **工厂方法模式**(Factory Method):定义一个创建对象的接口,但让子类决定实例化哪一个类。 - **抽象工厂模式**(Abstract Factory):提供一个接口,用于创建相关或依赖对象的族,而无需指定它们具体的类。 ...

    台湾人写的设计模式笔记

    主要分为五种:工厂方法(Factory Method)、抽象工厂(Abstract Factory)、单例(Singleton)、建造者\Builder、原型\(Prototype\)。例如,工厂方法允许在子类中定义实例化对象的具体过程,而单例模式确保一个类只有一个...

    设计模式学习笔记 .txt

    #### Factory Method(工厂方法)模式 - **定义**:定义一个用于创建对象的接口,让子类决定实例化哪一个类。 - **实现方式**:通过抽象工厂类或接口来定义创建产品的接口,具体工厂实现该接口并返回对应的产品对象...

    Java设计模式尚硅谷笔记

    本笔记主要涵盖了多种经典的设计模式,以下是对这些模式的详细解释: 1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。在Java中,通常通过双重检查锁定(Double-Check Locking)或静态内部类...

    Java中的design-patterns::open_book:使用通俗易懂的案例,类图,以及配套学习笔记来详解Java的二十种设计模式!

    :check_mark:工厂方法模式( Factory Method Pattern ) :memo: , :check_mark:抽象工厂模式( Abstract Factroy Pattern ) :memo: , :check_mark:建造者模式( Builder Pattern ) :memo: , :check_mark:单例...

    23种设计模式的解析与Cpp实现

    - 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。 - 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 - ...

    23个设计模式图解--学习笔记

    在《23个设计模式图解--学习笔记》中,我们探讨了这些模式,以便于理解和应用到实际开发中。以下是这23个设计模式的详细说明: 1. **工厂方法**(Factory Method):定义一个用于创建对象的接口,让子类决定实例化...

    23种面向对象设计模式

    文档中的“23种设计模式学习笔记.doc”可能包含了对这23种模式的详细解释和实例,而“设计模式之我爱我家.doc”可能从一个更生活化的角度来阐述设计模式的概念。“软件23种设计模式,超级经典的.pdf”可能是对这些...

    设计模式的读书总结笔记

    总之,“设计模式的读书总结笔记”是一份宝贵的资源,它可以帮助开发者系统地学习和掌握设计模式,提升软件设计的质量和效率。无论是初学者还是经验丰富的开发者,都可以从中受益匪浅。通过深入学习和实践,我们可以...

Global site tag (gtag.js) - Google Analytics