不一样的抽象工厂模式(设计模式七)
2023-09-14 09:01:09 时间
前言
工厂模式解决了对象创建导致的紧耦合的关系,从而支持对象创建的稳定。那么抽象工厂是解决什么问题呢?
我们知道要松耦合高内聚,那么什么时候需要高内聚呢?高内聚解决什么问题呢?
在软件系统中,经常面临着"一系列相互依赖对象"的创建工作。同时由于需求的变化,往往存在更多系列的创建工作呢?
正文
在我们数据库访问中,我们常常用到SqlConnection、SqlCommand、SqlDataReader,这是mmsql,但是有一个问题,这个是我们在使用不同数据库的时候呢,我们要切换不同对象,假设MySqlConnection、MySqlCommand、MySqlDataReader。
这样我们又得去修改代码,这是因为new SqlConnection 是具体实现,所以我们使用工厂模式来解决这个问题。
DBCommandFactory dBCommand;
DBConnectionFactory dBConnection;
DBDataReaderFactory dBDataReader;
public Application(DBConnectionFactory dBConnection, DBCommandFactory dBCommand, DBDataReaderFactory dBDataReader)
{
this.dBCommand = dBCommand;
this.dBConnection = dBConnection;
this.dBDataReader = dBDataReader;
}
public void doSomeThing()
{
//做一些操作
}
放出其他代码:
public interface IDBConnection
{
}
public abstract class DBConnectionFactory
{
public abstract IDBConnection CreateDBConnection();
}
public interface IDBCommand
{
}
public abstract class DBCommandFactory
{
public abstract IDBCommand CreateDBCommand();
}
public interface IDBDataReader
{
}
public abstract class DBDataReaderFactory
{
public abstract IDBDataReader CreateDBDataReader();
}
public class SqlConnection : IDBConnection
{
}
public class SqlConnectionFactory : DBConnectionFactory
{
public override IDBConnection CreateDBConnection()
{
return new SqlConnection();
}
}
public class SqlCommand : IDBCommand
{
}
public class SqlCommandFactory : DBCommandFactory
{
public override IDBCommand CreateDBCommand()
{
return new SqlCommand();
}
}
public class SqlDataReader : IDBDataReader
{
}
public class SqlDataReaderFactory : DBDataReaderFactory
{
public override IDBDataReader CreateDBDataReader()
{
return new SqlDataReader();
}
}
public class MySqlConnection : IDBConnection
{
}
public class MySqlCommand : IDBCommand
{
}
public class MysqlDataReader : IDBCommand
{
}
//mysql 的工厂我没有写
那么这个时候有啥问题呢?
DBCommandFactory dBCommand;
DBConnectionFactory dBConnection;
DBDataReaderFactory dBDataReader;
public Application(DBConnectionFactory dBConnection, DBCommandFactory dBCommand, DBDataReaderFactory dBDataReader)
{
this.dBCommand = dBCommand;
this.dBConnection = dBConnection;
this.dBDataReader = dBDataReader;
}
看上面代码,有一个问题就DBConnectionFactory 如果是mmsql,那么DBCommandFactory 、DBDataReaderFactory 同样要是这样。
那么就可以做一个这样的变化,这时候就是要高内聚。
public class Application
{
DBFactory dBFactory;
public Application(DBFactory dBFactory)
{
this.dBFactory = dBFactory;
}
public void doSomeThing()
{
dBFactory.CreateDBCommand();
dBFactory.CreateDBConnection();
dBFactory.CreateDBDataReader();
}
}
这里只放出mmsql 的代码:
public interface IDBConnection
{
}
public interface IDBCommand
{
}
public interface IDBDataReader
{
}
public abstract class DBFactory
{
public abstract IDBConnection CreateDBConnection();
public abstract IDBCommand CreateDBCommand();
public abstract IDBDataReader CreateDBDataReader();
}
public abstract class DBDataReaderFactory
{
}
public class SqlConnection : IDBConnection
{
}
public class SqlCommand : IDBCommand
{
}
public class SqlDataReader : IDBDataReader
{
}
public class SqlConnectionFactory : DBFactory
{
public override IDBCommand CreateDBCommand()
{
return new SqlCommand();
}
public override IDBConnection CreateDBConnection()
{
return new SqlConnection();
}
public override IDBDataReader CreateDBDataReader()
{
throw new NotImplementedException();
}
}
概念图
后续补上
相关文章
- 抽象工厂模式
- Docker 系列(三):Docker 网络模式详解
- 美团Leaf snowflake模式详解
- 设计模式之抽象工厂模式
- 炒冷饭系列:设计模式 抽象工厂模式
- 【设计模式】单例模式
- 抽象工厂模式
- C# 设计模式----抽象工厂模式
- 单例模式及常见写法分析(设计模式01)
- 从源头开始学习 Java 单例模式:线程安全和性能的双重保障
- Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)
- 设计模式(三)---抽象工厂模式
- 详谈 Java工厂 --- 抽象工厂模式
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
- Java 抽象工厂模式
- 002-创建型-02-抽象工厂模式(Abstract Factory)
- PHP CLI模式下的多进程应用分析
- 抽象工厂模式
- 外观模式
- 抽象工厂模式
- Nginx+keepalived 高可用双机热备(主从模式/双主模式)