首页 > 代码库 > 设计模式学习笔记-工厂模式

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

一、概述

     定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法(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:当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候;

 

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

 

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