Factory-Method工厂方法模式
1. 简介
- 动机
- 在软件系统中,经常面临“某个对象”的创建工作;由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口。
- “封装机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖对象的对象”不随着需求变化而变化
- 意图
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。
2. 示例
2.1. 武器工厂例子
2.1.1. 简单工厂
一个需要通过工厂创建对象的需求,所以不需要抽象,那么武器工厂就是具体实现类通过传参不同,制造不同的武器,返回类型为基类武器,实际对象为继承该基类的对象。
2.1.2. 工厂方法
时间定位在冷兵器的年代,武器种类的需求开始出现,单个工厂的方式出现问题:
- 代码逻辑复杂: 一个工厂负责所有产品生产
- 难以维护: 每当新增一个产品都需要修改这个工厂,这时不能保证原有业务不受影响
这时引入了工厂方法模式,可以解决这些问题。
示例:
开始生产的是匕首、太刀,后来需求变化需要宝剑的生产,而且预计后面还会生产其他的武器。
- 工厂方法类有且只有一个生产的产品线(方法),比如定义为:武器工厂来生产武器;
- 具体的工厂类继承工厂接口,比如:匕首工厂继承武器工厂接口
- 实际产品为:匕首(继承自武器)
- 设计带来的适应性:
- 开始工厂生产的是匕首、太刀,后来因为要适配新武器方便添加的需求,简单工厂模式升级为工厂方法模式
- 当新种类的武器(宝剑)需要生产,只需要增加宝剑工厂来满足需求,这个工厂可以生产宝剑,宝剑继承基类武器。
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://bigbrotherstone.cnblogs.com/
声明: 原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!