Factory-Method工厂方法模式

>>返回《C#常用设计模式》

1. 简介

  • 动机
    • 在软件系统中,经常面临“某个对象”的创建工作;由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口
    • “封装机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖对象的对象”不随着需求变化而变化
  • 意图
    • 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。

2. 示例

2.1. 武器工厂例子

2.1.1. 简单工厂

一个需要通过工厂创建对象的需求,所以不需要抽象,那么武器工厂就是具体实现类通过传参不同,制造不同的武器,返回类型为基类武器,实际对象为继承该基类的对象。

2.1.2. 工厂方法

时间定位在冷兵器的年代,武器种类的需求开始出现,单个工厂的方式出现问题:

  • 代码逻辑复杂: 一个工厂负责所有产品生产
  • 难以维护: 每当新增一个产品都需要修改这个工厂,这时不能保证原有业务不受影响

这时引入了工厂方法模式,可以解决这些问题。

示例:

开始生产的是匕首、太刀,后来需求变化需要宝剑的生产,而且预计后面还会生产其他的武器。

  1. 工厂方法类有且只有一个生产的产品线(方法),比如定义为:武器工厂来生产武器;
  2. 具体的工厂类继承工厂接口,比如:匕首工厂继承武器工厂接口
  3. 实际产品为:匕首(继承自武器
  4. 设计带来的适应性
    • 开始工厂生产的是匕首、太刀,后来因为要适配新武器方便添加的需求,简单工厂模式升级为工厂方法模式
    • 当新种类的武器(宝剑)需要生产,只需要增加宝剑工厂来满足需求,这个工厂可以生产宝剑,宝剑继承基类武器

2.2. 数据库访问工厂示例代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Demo
{
    class Program
    {
        static IFactory fac = new MySQLFactory();
        static void Main(string[] args)
        {
            ISqlHelper sqlHelper = fac.CreateSqlHelper();
            sqlHelper.Execute();
            Console.ReadKey();
        }
    }

    #region 定义接口
    //约定工厂能创建那个类型产品 武器工厂
    public interface IFactory
    {
        ISqlHelper CreateSqlHelper();
    }
    //约定工厂产品的特点 武器
    public interface ISqlHelper
    {
        int Execute();
        object ExecuteScale();
    }
    #endregion

    #region 具体实现
    //工厂方法的具体实现 太刀工厂
    public class MSSQLFactory : IFactory
    {
        public ISqlHelper CreateSqlHelper()
        {
            return new MSSQLSqlHelper();
        }
    }

    //工厂方法的具体实现2 匕首工厂
    public class MySQLFactory : IFactory
    {
        public ISqlHelper CreateSqlHelper()
        {
            return new MySQLSqlHelper();
        }
    }



    //产品的具体实现 匕首
    public class MySQLSqlHelper : ISqlHelper
    {

        public int Execute()
        {
            Console.WriteLine("MySQLExecute");
            return 1;
        }

        public object ExecuteScale()
        {
            Console.WriteLine("MySQLExecuteScale");
            return new object();
        }
    }

    //产品的具体实现2 太刀
    public class MSSQLSqlHelper : ISqlHelper
    {

        public int Execute()
        {
            Console.WriteLine("MSSQLExecute");
            return 1;
        }

        public object ExecuteScale()
        {
            Console.WriteLine("MSSQLExecuteScale");
            return new object();
        }
    }
    #endregion
}

参考资料:
https://www.cnblogs.com/sanjun/p/9972386.html

posted @ 2021-02-10 07:18  大师兄石头  阅读(598)  评论(0编辑  收藏  举报