2021年2月10日星期三

Factory-Method工厂方法模式

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

  • 1. 简介
  • 2. 示例
    • 2.1. 武器工厂例子
      • 2.1.1. 简单工厂
      • 2.1.2. 工厂方法
    • 2.2. 数据库访问工厂示例代码

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(); } 

没有评论:

发表评论