Head First设计模式之工厂模式

简介: 一、定义 定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类 二、结构 1、抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。

一、定义

定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类

二、结构

1、抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
2、具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3、抽象产品角色:它是具体产品继承的父类或者是实现的接口。
4、具体产品角色:具体工厂角色所创建的对象就是此角色的实例。

三、实现

namespace DesignPatterns.FactoryMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("使用工厂方法进行计算");
            Factory factory1 = new AddFactory();
            Operation operation1 = factory1.CreateOperation();
            operation1.numberA = 10;
            operation1.numberB = 20;
            Console.WriteLine("{0}+{1}={2}", operation1.numberA, operation1.numberB, operation1.GetResult());

            Factory factory2 = new SubFactory();
            Operation operation2 = factory2.CreateOperation();
            operation2.numberA = 10;
            operation2.numberB = 20;
            Console.WriteLine("{0}-{1}={2}", operation2.numberA, operation2.numberB, operation2.GetResult());
            Console.Read();
        }
    }

    /// <summary>
    /// 抽象操作类
    /// </summary>
    public abstract class Operation
    {
        public int numberA;
        public int numberB;
        public abstract int GetResult();
    }
    /// <summary>
    /// 加法操作
    /// </summary>
    public class AddOperation : Operation
    {
        public override int GetResult()
        {
            return (this.numberA + this.numberB);
        }
    }
    /// <summary>
    /// 减法操作
    /// </summary>
    public class SubOperation : Operation
    {
        public override int GetResult()
        {
            return (this.numberA - this.numberB);
        }
    }

    public abstract class Factory
    {
        public abstract Operation CreateOperation();
    }

    public class AddFactory : Factory
    {
        public override Operation CreateOperation()
        {
            return new AddOperation();
        }
    }

    public class SubFactory : Factory
    {
        public override Operation CreateOperation()
        {
            return new SubOperation();
        }
    }
}

四、适用场景

  • 类不知道自己要创建哪一个对象时
  • 类用它的子类来指定创建哪个对象
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候  

五、优缺点

优点:

  • 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象。而且如何创建一个具体产品的细节完全封装在具体工厂内部,符合高内聚,低耦合。
  • 在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体工厂和具体产品,很好的利用了封装和委托。

缺点:

  • 在添加新产品时,需要编写新的具体产品类(其实这不算一个缺点,因为这是不可避免的),要增加与之对应的具体工厂类。

 

参考:

http://www.cnblogs.com/yinxiangpei/articles/2366092.html

http://www.cnblogs.com/ywqu/archive/2010/01/07/1640855.html

http://www.cnblogs.com/Terrylee/archive/2006/01/04/310716.html

 

欢迎阅读本系列文章:Head First设计模式之目录

 

相关文章
|
5月前
|
设计模式 Java
Head First设计模式学习笔记
Head First设计模式学习笔记
|
设计模式
Head First 设计模式 —— 04. 工厂 (Factory) 模式
Head First 设计模式 —— 04. 工厂 (Factory) 模式
347 0
|
设计模式
Head First 设计模式 —— 03. 装饰器 (Decorator) 模式
Head First 设计模式 —— 03. 装饰器 (Decorator) 模式
350 0
|
设计模式 JavaScript Java
Head First 设计模式 —— 02. 观察者 (Observer) 模式
Head First 设计模式 —— 02. 观察者 (Observer) 模式
284 0
|
设计模式 算法 Java
Head First 设计模式 - 01. 策略 (Strategy) 模式
Head First 设计模式 - 01. 策略 (Strategy) 模式
382 0
|
设计模式 数据可视化 知识图谱
Head First 设计模式 —— 00. 引子
Head First 设计模式 —— 00. 引子
378 0
|
监控 C#
气象站的故事--Head First设计模式
现在我们要为一家气象站开发一套气象监控系统,按照客户的要求,这个监控系统必须可以实时跟踪当前的天气状况(温度、湿度、大气压力),并且可以在三种不同设备上显示出来(当前天气状况、天气统计、天气预测)。客户还希望这个系统可以对外提供一个API接口,以便任何开发者都可以开发自己的显示设备,然后无缝挂接到系统中,系统可以统一更新所有显示设备的数据。
799 0
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
1月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###