通过更新dll来更新软件,阐述解耦思想

通过更新dll来更新软件,阐述解耦思想

接口

解耦,就是把耦合起来的东西,解开来,不是少写东西
解耦是一种思想,在每个地方的实现都不一样。解在不同的地方。
解耦的一个主要目的:是为了分工,分工是为了高效。适用于大型软件,特别是需要多人合作的软件,必须掌握各种解耦技巧和方法
解耦:工作里,是主管经理,写的。工作实际中,懂这个业务人写的,相机,打开设备,关闭相机、设置曝光,软触发,硬触发。每个相机都这是这样的,只有比较深耕这个行业的人,他才能写好这个接口。

  1. 接口的解耦-可以把调用和实现进行解耦(分开),我需要相机有什么方法,我先在接口中定义,然后直接使用即可,将具体的实现交给别人再去实现
  2. 简单工厂的解耦-不直接依赖具体类,只依赖工厂和接口
  3. dll更新的解耦:不需要更新程序代码,就能更新软件。

C S h a r p 之简单工厂模式 CSharp之简单工厂模式 CSharp之简单工厂模式

当我们通过工厂方法完成对象创建的时候,我们的前端调用和后台实现完全解耦。
给一个新的dll,就可以实现无编译的更新
简单工厂就是个我们后续更多设计模式的学习,做的一个铺垫,和基础。
说简单实际一点:(1)解耦了实现和调用。允许未实现(先有个定义)就先调用。-上节课:讲的接口特性:允许实现类赋值给接口(2)切换相机不需要改代码,直接可以通过改配置文件实现。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace C_之简单工厂模式_使用App.config配置文件_
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 接口:可以把调用和实现进行解耦(分开),我需要相机有什么方法,我先在接口中定义,然后直接使用即可,将具体的实现交给别人再去实现
            // 在现实中,我们可能直到相机可以拍照,但是不知道海康相机或者其他相机具体拍照是如何实现的,我们就可以先定义一个接口,继续往下写,把具体实现交给的专业人员。
            // 接口特性:允许实现接口的类赋值给该接口

            // 用海康的时候,new 海康
            //ICamera Cam = new HikCamera();
            //Cam.Start();
            //Cam.Snap();
            //Cam.Close();    

            // 用大华的时候就new 大华
            //ICamera Cam = new DaHuaCamera();
            //Cam.Start();
            //Cam.Snap();
            //Cam.Close();    



            // 调用过程,没说用的海康还是大华
            ICamera camera = SimpleFactory.CamSDKCreator();
            camera.Start();
            camera.Snap();
            camera.Close();

            // 1.解耦,我写代码的时候,不要考虑实现(交给别人去写),真把程序允许起来的时候,程序是可以起来的,但是你的功能没有

            // 2.切换相机时候,我们直接修改配置文件就可以,不用改代码了


        }
    }


    /// <summary>
    /// 简单工厂(根据配置文件,去生成对应的实例)
    /// </summary>
    public class SimpleFactory
    {

        // 不根据修改代码切换相机,根据app.config的配置文件进行相机的切换
        public static string camType = ConfigurationManager.AppSettings["camType"].ToString();  

        public static ICamera CamSDKCreator()
        {
            if (camType== "HikCamSDK")
            {
                return new HikCamera();
            }
            else
            {
                return new DaHuaCamera();
            }
        }
    }
}

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

namespace C_之简单工厂模式_使用App.config配置文件_
{
    public interface ICamera
    {
        bool Start();

        bool Snap();

        bool Close();
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace C_之简单工厂模式_使用App.config配置文件_
{
    internal class HikCamera : ICamera
    {
        public bool Close()
        {
            MessageBox.Show("海康相机关闭");
            return true;
        }

        public bool Snap()
        {
            MessageBox.Show("海康相机拍照");
            return true;
        }

        public bool Start()
        {
            MessageBox.Show("海康相机打开");
            return true;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace C_之简单工厂模式_使用App.config配置文件_
{
    internal class DaHuaCamera : ICamera
    {
        public bool Close()
        {
            MessageBox.Show("大华相机关闭");
            return true;
        }

        public bool Snap()
        {
            MessageBox.Show("大华相机关闭");
            return true;
        }

        public bool Start()
        {
            MessageBox.Show("大华相机关闭");
            return true;
        }
    }
}

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
	<appSettings>
		<add key="camType" value="DaHuaCamSDK"/>
	</appSettings>
</configuration>

简单工厂实习的基本步骤:

1.根据实际需求,封装变化(把要完成的任务,抽象为接口)
2.根据接口,编写不同的实现类。


一般的代码:经过分析,扩展性几乎没有。

按照OOP的基本原则–>开-闭原则(开放增加,封闭修改)

OOP告诉我们:写程序尽量体现"高内聚,低耦合"
低耦合:也就是对象或者一个模块,和另一个对象,或者另一个模块,他们之间不是直接依赖关系,比如对象使用,不是直接使用,而是通过工厂完成。也就是意味着对象的产生做了延迟。


常规设计(不用使用简单工厂类)

接口

    /**
     * 规定了要完成的主要任务
     * **/
    public interface ICamSDK
    {
         bool Start();

         bool Close();
    }

子类

    public class BaslerCamSDK : ICamSDK
    {
        public bool Close()
        {
            // 实际开发中,放入具体的实现内容,其实这些都是要封装到类库中的,才是最后的商用
            Console.WriteLine("Basler close");
            return true;
        }

        public bool Start()
        {
            Console.WriteLine("Basler close");
            return true;
        }
    }

子类

    public class HikCamSDK : ICamSDK
    {
        public bool Close()
        {
            Console.WriteLine("HikCam close");
            return true;
        }

        public bool Start()
        {
            Console.WriteLine("HikCam start");
            return true;
        }
    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
	<appSettings>
		<add key="camType" value="HikCamSDK"/>
	</appSettings>
</configuration>
	<appSettings>
		<add key="camType" value="HikCamSDK"/>
	</appSettings>

HikCamSDK需要和之前类的设计名字相同,因为就是调用它

在这里插入图片描述

简单工厂类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using 设计模式之简单工厂模式.CameraSDK;

namespace 设计模式之简单工厂模式
{
    /**
     * 简单工厂:构造单一对象的任务
     * 提供一个对象创建的方法
     * **/
    class SimpleFactory
    {
        // 1. 根据用户的需求创建对象(这个需求,我们可以动态的配置到配置文件中)
        private static string camType = ConfigurationManager.AppSettings["camType"].ToString();

        // 2. 编写工厂方法
        public static ICamSDK CamSDKCreator()
        {
            if (camType == "HikCamSDK")
            {
                return new HikCamSDK(); 
            }
            else if (camType == "BaslerCamSDK")
            {
                return new BaslerCamSDK();
            }
            else
            {
                // 默认
                return null;
            }

        }
    }
}

主程序调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using 设计模式之简单工厂模式.CameraSDK;

namespace 设计模式之简单工厂模式
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. 通常做法,不使用简单工厂设计模式
            // 经过分析,这样使用太繁琐,扩展性几乎没有,所以诞生了简单工厂模式
            ICamSDK camSDK = new HikCamSDK();
            camSDK.Start();
            camSDK.Close();
            Console.ReadLine();

            /***
             * 
               按照OOP的基本原则–>开-闭原则(开放增加,封闭修改)
               OOP告诉我们:写程序尽量体现"高内聚,低耦合"
               低耦合:也就是对象或者一个模块,和另一个对象,或者另一个模块,他们之间不是直接依赖关系,比如对象使用,不是直接使用,而是通过工厂完成。
               也就是意味着对象的产生做了延迟。
             * 
             * **/

            // 2. 使用简单工厂设计模式(我前端就只需要调用SimpleFactory.CamSDKCreator,至于是哪个相机我交给了工厂,实现了解耦)
            ICamSDK camSDK2 = SimpleFactory.CamSDKCreator();
            camSDK2.Start();
            camSDK2.Close();
            Console.ReadLine();

        }
    }
}

在这里插入图片描述

修改配置,即可改变程序(好处)

不用还要改代码new
ICamSDK camSDK = new HikCamSDK();
camSDK.Start();
camSDK.Close();
Console.ReadLine();

在这里插入图片描述
在这里插入图片描述


简单工厂模式的优点

  1. 解耦:客户端不直接依赖具体类,只依赖工厂和接口。
  2. 集中管理:所有创建逻辑在工厂里,修改方便。
  3. 扩展性:新增产品时,只需修改工厂(符合开闭原则的部分实现)。

总结

简单工厂模式就像“点餐系统”:

  • 你(客户端)说“我要A”。
  • 系统(工厂)根据规则返回对应的对象(产品)。
  • 你不用关心对象是怎么创建的,只管用就行!

适合简单场景,但复杂项目建议用工厂方法抽象工厂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值