zoukankan      html  css  js  c++  java
  • 不一样的抽象工厂模式(设计模式七)

    前言

    工厂模式解决了对象创建导致的紧耦合的关系,从而支持对象创建的稳定。那么抽象工厂是解决什么问题呢?

    我们知道要松耦合高内聚,那么什么时候需要高内聚呢?高内聚解决什么问题呢?

    在软件系统中,经常面临着"一系列相互依赖对象"的创建工作。同时由于需求的变化,往往存在更多系列的创建工作呢?

    正文

    在我们数据库访问中,我们常常用到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();
    	}
    }
    

    概念图

    后续补上

  • 相关阅读:
    旧文备份:CANopen协议PDO的几种传输方式
    CANopen 基础
    单片机FLASH与RAM、ROM的关系
    在CANopen网络中通过LSS服务设置节点地址和网络波特率
    STM32F103 CAN中断发送功能的再次讨论
    由RS-232串口到PROFIBUS-DP总线的转换接口设计
    profibus 的DPV0 和DPV1
    PROFIBUS-DP
    profibus总线和profibus dp的区别
    获取验证码倒计时
  • 原文地址:https://www.cnblogs.com/aoximin/p/13587684.html
Copyright © 2011-2022 走看看