项目常用框架设计方法和设计模式(简单工厂)

版权声明:Copyright:@@个人所有 https://blog.csdn.net/y20_20/article/details/90812877

引入:##开发中项目的搭建框架和简单工厂设计模式的使用

内容目录

一、架构
二、框架
三、接口的使用
四、简单工厂设计模式

内容介绍

一、架构

1、架构: 通常是从不同的角度去设计和研究一个软件
2、结构的分类:

  1. 逻辑架构:能够很好的反应一个软件的核心架构组成和模块设计关系等
  2. 技术架构:根据逻辑架构设计开发架构
  3. 物理架构:主要是项目如何部署问题

二、框架

1、框架: 技术架构通常使用框架,主要解决项目总体的组成结构。例如:Java的SSH框架,.NET的三层设计框架、MVC等
2、三层框架:

  1. 实体层(Models):封装和传递数据
  2. 数据访问层(DAL):分为通用数据访问类(专用的通用数据访问工具,访问文件)和一般数据访问类
  3. 业务逻辑层(BLL):封装业务逻辑、算法和数据传递
  4. UI层:
    (1)、CS程序:WinForm、wpf
    (2)、WEB程序:webform、MVC
    (3)、WEB服务:WCF、webservice、webapi2
  5. 还有ABP或者自己定义的框架

三、接口的使用

1、使用接口和设计模式能更好的将核心模块解耦
2、接口设计: 按照接口隔离原则,设计的接口尽量小,不能设计万能接口;也不能将接口设计的过小,导致接口污染问题
3、使用接口的好处: 方便团队开发,同时保持项目之间的接口传递的稳定性

四、设计模式(简单工厂)

1、设计模式: 通过解决一个特定问题而提出的方案,这个问题可能出现在框架的任何部分
2、设计模式的简单分类:

  1. 创建型:解决对象的创建问题(单利、简单工厂、抽象工厂)
  2. 结构型
  3. 行为型

3、对象创建问题:

  1. 需要几个创建几个,GC负责对象的销毁
  2. 延迟创建:一般应用阶段,通过某些方法调用,还有自己写的框架和第三方代理完成
  3. 多态特性体现:不能直接创建多个对象,对象交给后继者创建,使用者可能通过行为调用,二不用关心具体如何创建对象

4、简单工厂:

  1. 简单工厂解决的是单一对象的创建问题
  2. 应用领域:使用的对象存在不同的变化,需要封装多个变化,根据需要返回一个特定的对象的情况都可以使用简单工厂
  3. 注意:设计模式通常都需要接口
  4. 接口的作用:约束和扩展

5、简单工厂代码示例

第一种方式,需要几个对象就创建几个对象:

IDataExport dataPort = new ExcelImport(); //这样做只起到约束作用,这样使用接口意义不大
IDataExport dataPort = new JsonImport();
     //第一种方法:以上为创建多个对象

第二种方式,为创建的方法提供通知

  private string type = ConfigurationManager.AppSettings["objectType"].ToString();//获取通知

        /// <summary>
        /// 对象创建的方法需要提供一个对象创建的通知,这个通知放到App.config中
        /// </summary>
        /// <returns></returns>
        public IDataExport CreateObjcet()
        {
            // 在这个地方如果需求变化,还得修改代码,没有根本解决问题
            if (type.Equals("ExcelImport"))
            {
                return new ExcelImport();
            }
            else if (type.Equals("JsonImport"))
            {
                return new JsonImport();
            }
            else
                return null;
            // 以上步骤为第二种方法:如果添加了对象需求就得更改代码
        }

第三种方法,使用简单工厂
首先创建一个控制台程序CustomerUI(UI)并设为启动项,再添加2个程序集DataLayerImport(接口实现类)和IBizLayer(接口)
基本框架:
在这里插入图片描述
Program.cs类代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//引入接口和接口实现程序集命名空间
using IBizLayer;
using DataLayerImport;

namespace CustomerUI
{
    class Program
    {
        public  static void Main(string[] args)
        {
            //IDataExport dataPort = new ExcelImport(); //这样做只起到约束作用,这样使用接口意义不大
            //IDataExport dataPort = new JsonImport();
            //第一种方法:以上为创建多个对象

            IDataExport dataPort =new  SimpleObjectFactory().CreateObject();//第二种方法延迟创建对象(工厂模式,不知道程序怎么创建的对象)
            dataPort.ExecutePort();
            dataPort.SaveData();
            Console.ReadKey();
        }
    }
}

ExcelImport类(接口实现类)代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//引入接口命名
using IBizLayer;

namespace DataLayerImport
{
    public  class ExcelImport : IBizLayer.IDataExport
    {
        public bool ExecutePort()
        {
            //接口实现
            Console.WriteLine("excel数据导出");
            return true;
        }

        public int SaveData()
        {
            Console.WriteLine ("excel数据保存");
            return 1;
        }
    }
}

JsonImport类(接口实现类)代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IBizLayer;

namespace DataLayerImport
{
    public class JsonImport:IBizLayer.IDataExport
    {
        public bool ExecutePort()
        {
            //接口实现
            Console.WriteLine("json数据导出");
            return true;
        }

        public int SaveData()
        {
            Console.WriteLine("json数据保存");
            return 1;
        }
    }
}

SimpleObjectFactory简单工厂类(动态创建对象)的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 //引入命名空间
using IBizLayer;
using System.Configuration;
using System.Reflection;

namespace DataLayerImport
{
    public  class SimpleObjectFactory
    {
        private string type = ConfigurationManager.AppSettings["objectType"].ToString();//获取通知

        /// <summary>
        /// 对象创建的方法需要提供一个对象创建的通知,这个通知放到App.config中
        /// </summary>
        /// <returns></returns>
        //public IDataExport CreateObjcet()
        //{
        //    // 在这个地方如果需求变化,还得修改代码,没有根本解决问题
        //    if (type.Equals("ExcelImport"))
        //    {
        //        return new ExcelImport();
        //    }
        //    else if (type.Equals("JsonImport"))
        //    {
        //        return new JsonImport();
        //    }
        //    else
        //        return null;
        //    // 以上步骤为第二种方法:如果添加了对象需求就得更改代码
        //}

        //第三种方法,使用反射创建对象
        public IDataExport CreateObject()
        {
            return  (IDataExport)Assembly.Load("DataLayerImport").CreateInstance($"DataLayerImport.{type}");//转化为借口类型
        }
    }
}

IDataExport接口类代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IBizLayer
{
    public interface IDataExport
    {
        bool ExecutePort();

        int SaveData();
    }
}

测试运行结果一:当配置字符串为JsonImport时结果如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="objectType" value="JsonImport"/>
  </appSettings>
</configuration>

在这里插入图片描述
测试运行结果二:当配置字符串为ExcelImport时结果如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="objectType" value="ExcelImport"/>
  </appSettings>
</configuration>

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/y20_20/article/details/90812877