版权声明:Copyright:@@个人所有 https://blog.csdn.net/y20_20/article/details/90812877
引入:##开发中项目的搭建框架和简单工厂设计模式的使用
内容目录
一、架构
二、框架
三、接口的使用
四、简单工厂设计模式
内容介绍
一、架构
1、架构: 通常是从不同的角度去设计和研究一个软件
2、结构的分类:
- 逻辑架构:能够很好的反应一个软件的核心架构组成和模块设计关系等
- 技术架构:根据逻辑架构设计开发架构
- 物理架构:主要是项目如何部署问题
二、框架
1、框架: 技术架构通常使用框架,主要解决项目总体的组成结构。例如:Java的SSH框架,.NET的三层设计框架、MVC等
2、三层框架:
- 实体层(Models):封装和传递数据
- 数据访问层(DAL):分为通用数据访问类(专用的通用数据访问工具,访问文件)和一般数据访问类
- 业务逻辑层(BLL):封装业务逻辑、算法和数据传递
- UI层:
(1)、CS程序:WinForm、wpf
(2)、WEB程序:webform、MVC
(3)、WEB服务:WCF、webservice、webapi2 - 还有ABP或者自己定义的框架
三、接口的使用
1、使用接口和设计模式能更好的将核心模块解耦
2、接口设计: 按照接口隔离原则,设计的接口尽量小,不能设计万能接口;也不能将接口设计的过小,导致接口污染问题
3、使用接口的好处: 方便团队开发,同时保持项目之间的接口传递的稳定性
四、设计模式(简单工厂)
1、设计模式: 通过解决一个特定问题而提出的方案,这个问题可能出现在框架的任何部分
2、设计模式的简单分类:
- 创建型:解决对象的创建问题(单利、简单工厂、抽象工厂)
- 结构型
- 行为型
3、对象创建问题:
- 需要几个创建几个,GC负责对象的销毁
- 延迟创建:一般应用阶段,通过某些方法调用,还有自己写的框架和第三方代理完成
- 多态特性体现:不能直接创建多个对象,对象交给后继者创建,使用者可能通过行为调用,二不用关心具体如何创建对象
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>