设计模式学习笔记-工厂模式

一、概述

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法(Factory Method)使一个类的实例化延迟到其子类;

2、模式中的角色

Product(Map):定义工厂方法所创建的对象的接口。

ConcreteProduct(BaiduMap、GaodeMap):具体Product,实现Product接口。

Creator(IMapFactory):声明工厂方法,该方法返回一个Product类型的对象。

ConcreteCreator(BaiduMapFactory、GaodeMapFactory):重定义工厂方法以返回一个ConcreteProduct实例。

3、UML类图

4、代码实现

    public class Map
    {
        /// <summary>
        /// 地图名称
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 操作
        /// </summary>
        public virtual void Print() { }
    }

    public class GaodeMap : Map
    {
        public override void Print()
        {
            Console.WriteLine("选择了{0}地图",Name);
        }
    }

    public class BaiduMap : Map
    {
        public override void Print()
        {
            Console.WriteLine("选择了{0}地图", Name);
        }
    }

    /// <summary>
    /// 工厂构造接口
    /// </summary>
    public interface IMapFactory
    {
        /// <summary>
        /// 返回父类
        /// </summary>
        /// <returns></returns>
        Map CreateMap();
    }

    /// <summary>
    /// 实现类
    /// </summary>
    public class BaiduMapFactory : IMapFactory
    {
        /// <summary>
        /// 返回具体类
        /// </summary>
        /// <returns></returns>
        public Map CreateMap()
        {
            return new BaiduMap();
        }
    }

    /// <summary>
    /// 实现类
    /// </summary>
    public class GaodeMapFactory : IMapFactory
    {
        /// <summary>
        /// 返回具体类
        /// </summary>
        /// <returns></returns>
        public Map CreateMap()
        {
            return new GaodeMap();
        }
    }

        static void Main(string[] args)
        {
            #region 工厂模式实现
            IMapFactory mapFactory = new BaiduMapFactory();
            Map map = mapFactory.CreateMap();
            map.Name = "百度";
            map.Print();

            mapFactory = new GaodeMapFactory();
            map = mapFactory.CreateMap();
            map.Name = "高德";
            map.Print();
            #endregion

            Console.ReadLine();
        }

4、应用场景

4.1:当一个类不知道它所必须创建的对象的类的时候;

4.2:当一个类希望由它子类来指定它所创建的对象的时候。

4.3:当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候;

参考书籍《设计模式-可复用面向对象软件的基础》

时间: 2024-10-11 22:02:55

设计模式学习笔记-工厂模式的相关文章

设计模式学习02—工厂模式

1.动机与定义 我们在程序中使用一个对象时,需要new一下,如果需要设置其他值就再初始化一下.比如我要使用一个按钮,手动new一个矩形按钮,然后初始化一些值,如显示文字,背景色等. // 矩形按钮 IButton btn = new RecButton(); // 初始化其他值 btn.setText("提交"); btn.setBackgroundColor("#00aaff"); // 其他初始化省略 // 圆形按钮 IButton btn2 = new Rou

设计模式学习笔记--工厂方法模式

学习过简单工厂模式,感觉很好用.在创建对象时,可以将复杂的初始化操作从客户端分离出来,简化客户端代码.大大的减少了代码修改的难度.而且可以通过参数不同,创建不同的对象. 但是简单工厂模式也有一些弊端,违背了开放--封闭原则.即如果我们增加了一个产品,对应的工厂也要进行修改,即switch---case中要新增加一些分支条件,不利于扩展.所以就有了下面的工厂方法模式: 工厂方法模式:定义了一个用于创建对象的接口,子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到子类. // 设计模式Dem

《Head First 设计模式》学习笔记——工厂模式 + 抽象工厂模式

设计模式 工厂模式:定义一个创建对象的接口,但由子类决定要实例化的是哪一个.工厂方法让类把实例化推迟到子类. 所谓的"决定",并非指模式同意子类本身在执行时做决定,而是指在编写创建者类时.不须要知道实际创建的产品是哪一个. 选择了使用这个子类,就自然的决定了实际创建的产品是什么. 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族.而不须要指定详细类. 抽象工厂的任务时定义一个负责创建一组产品的接口.这个接口内的每一个产品都负责创建一个详细产品.使用工厂方法. 设计原则 (1)多

&lt;C/C++ 版&gt; 设计模式 学习之 工厂模式 &lt;1&gt;

大话设计模式这本书使用 C# 语言写的,我用的是 C++ 语言,最近在看这本书,所以用 C++ 语言走了一遍. 以下是部分笔记,包括代码 若不涉及面向对象这个概念,我们写的简易计算器可能是下面这个样子 //User.cpp --- 客户端 #include "iostream" int main() { using namespace std; cout<<"Input First Number : "; int number_a; cin>>

设计模式学习之工厂模式[转]

工厂模式笔记 摘自http://blog.csdn.net/wuzhekai1985 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径.设计模式中运用了面向对象编程语言的重要特性:封装.继承.多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累.最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解.主要参考<大话设计模式>和<设计模式:可复用面向对象软件的基础>两本书.本文介绍工厂模式的实现. 工厂模式属于创建型模式,大致可以分

设计模式学习之--工厂模式

今天学习的设计模式是工厂模式.那么为什么叫它工厂模式呢?工厂模式,顾名思义就是用一个工厂生产各种东西,工厂模式是如何体现的呢? 首先,工厂模式有简单的工厂模式和抽象工厂模式两种,我们先用一个发型的工厂来演示一下简单的工厂模式: 一个发型接口:工厂模式是面向接口编程的,这样可以更易于程序的扩展 package com.sunny.project; /** * 发型接口 * @author Administrator * */ public interface HairInterface { /**

设计模式学习笔记--外观模式

好久没写设计模式的blog了,这次重新回来填坑,先找一个最简单但是却最常用的设计模式来学习,外观模式.其实说是一个设计模式,其实我们在实际的编程中无时无刻不在用外观模式,可以说这个设计模式已经渗透到编程的各个方便,可能我们自己没感觉出来罢了. 一.外观模式的定义 先来看一下外观模式的定义: 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个接口使得这一系列子系统更加容易使用. 简单解释一下,所谓外观模式,就是在我们设计系统的时候,将若干个子系统的功

设计模式学习——简单工厂模式

模式概述:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,简单工厂(Simple Factory)模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,但其不属于23种GOF设计模式之一,通常它根据自变量的不同返回不同的类的实例.     UML类图: 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建出哪一个产品类的实例.由上图可以看出,简单工厂模式有工厂.抽象产品.具体产品三个角色. 工厂角色(Factory) 是

设计模式学习笔记--策略模式

定义: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 我们在使用一些功能时,有时有很多种实现方法,或者多种结果,但是都有同样的使用方法,即调用接口,这就是策略模式. 例子: // 设计模式Demo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <string> using namespa