工厂模式-简单工厂模式

工厂模式

工厂顾名思义就是创建产品,本质就是用工厂方法代替new操作创建一种实例化对象的方式。根据不同的实现方式和抽象级别又可分为简单工厂,工厂方法和抽象工厂三种模式。

案例

需求

封装一个SqlHelper类,实现对SqlServer的操作,且后续可能需要同时支持SqlServer,MySql,Oracle等主流数据库。

UML类图

简单工厂

定义

简单工厂又叫做静态工厂方法模式,但不属于23种设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

UML类图

优缺点

  • 优点

    • 实现了对责任的分割,隔离了变化,因为它提供了专门的工厂类用于创建对象。
    • 通过配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
  • 缺点

    • 集中了所有实例的创建逻辑,违反了单一职责原则
    • 扩展困难,一旦添加新产品就不得不修改工厂逻辑,违反了开闭原则

 代码:

1.Program.cs

public class Program
{
static void Main(string[] args)
{
SqlHelper sqlHelper = new SqlHelper();

string selectSql = "select count(*) from Persons;";
object count = sqlHelper.ExecuteScalar(selectSql);

Console.WriteLine($"共有{count}记录");
}
}

2.SqlHelper.cs

public class SqlHelper
{
/// <summary>
/// 增删改操作,返回影响条数
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public int ExecuteNonQuery(string sql)
{
using (DbConnection conn = DbConnectionFactory.CreateDbConnection())
{
using (DbCommand cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = sql;
return cmd.ExecuteNonQuery();
}
}
}

/// <summary>
/// 查询操作,返回查询结果中的第一行第一列的值
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public object ExecuteScalar(string sql)
{
using (DbConnection conn = DbConnectionFactory.CreateDbConnection())
{
using (DbCommand cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = sql;
return cmd.ExecuteScalar();
}
}
}
}

3.DbConnectionFactory.cs

public static class DbConnectionFactory
{
private static readonly string _connectionString = "Server=.;Database=demo;uid=sa;pwd="";Trusted_Connection=True;MultipleActiveResultSets=true;TrustServerCertificate=true;";

private static readonly string _dbType = "Sqlserver";

public static DbConnection CreateDbConnection()
{
if (_dbType == "Sqlserver")
{
return new SqlConnection(_connectionString);
}
else if (_dbType == "MySql")
{
return null;
}
else
{
return null;
}
}
}

 运行结果:

 

 本文参考自https://github.com/ZShijun/DesignPattern.git

 

 

posted on 2023-04-23 13:32  一只向上爬的小蜗牛  阅读(21)  评论(0编辑  收藏  举报