设计模式

1.什么是设计模式

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

本教程将通过 Java 实例,一步一步向您讲解设计模式的概念。+

2.spring中用到的设计模式.

工厂模式

这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式

可以自己决定实例化哪个类,而不暴露内在的创建逻辑

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

**意图:**定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

**如何解决:**让其子类实现工厂接口,返回的也是一个抽象的产品。

优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。

**缺点:**每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

代码实例:

1.首先创建接口,

package factory;

public interface Colour {
    void getColour ();
}

2.创建实体类来继承接口,并实现方法

public class Red implements Colour {
    @Override
    public void getColour() {
        System.out.println("Red");
    }
}


public class Yellow implements Colour {
    @Override
    public void getColour() {
        System.out.println("Yellow");
    }
}

3.
创建一个工厂,按照输入的信息,来创建并返回相应的实体类的实例

public class Factory {

    public Colour getColour(String colour)
    {
        if(colour=="red")
        {
            return new Red();

        }
        if(colour=="yellow")
        {
            return new Yellow();

        }
        return null;
    }

    public static void main(String[] args) {
        String str1="red";
        String str2="yellow";
        Factory factory=new Factory();
       Colour colour1= factory.getColour(str1);
       Colour colour2=factory.getColour(str2);
       colour1.getColour();
       colour2.getColour();
    }

}

使用场景 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。

在这里插入图片描述

工厂模式由一个接口类加一个对应的工厂类实现的,接口类提供所有要创建出来的实体所需要的方法,工厂类只负责一件事:创建实现类的对象的方法。

先提供出接口类和实现类:

public interface ICar {
    void getBrand();
}

public class Audi implements ICar {
    public void getBrand() {
        System.out.printf("My brand is %s \n", Audi.class.getSimpleName());
    }
}
public class Benz implements ICar {
    public void getBrand() {
        System.out.printf("My brand is %s \n", Benz.class.getSimpleName());
    }
}

实现类会把类名打出来,我们现在要写个工厂类负责构造实现类的对象。

public class SimpleFactory2 {
    public ICar createCar(Class<? extends  ICar> carClass){
        try {
            return carClass.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
 
        return null;
    }
 
    public static void main(String[] args) {
        SimpleFactory2 carFactory = new SimpleFactory2();
        ICar audi = carFactory.createCar(Audi.class);
        audi.getBrand();
        ICar benz = carFactory.createCar(Benz.class);
        benz.getBrand();
    }

工厂类的实现是根据实体类的Class的类型来自动生成实例,这种方式极大了提升了程序的扩展性,后续工厂类不需要做任何更改,只要加让实体类实现ICar接口,那么就能通过工厂类生产出相应的车辆。

现在最热门的Spring框架的IOC就是基于工厂模式,IOC通过DI(依赖注入)的方式将bean的创建交给了Spring Container,Spring Container 自动帮我们创建对象,我们只需要使用即可。

下面将采用Spring提供的一些组件来实现一个简单工厂,首先原有的实体类需要做下改造,类上加了@Component注解:

@Component
public class Audi implements ICar {
    public void getBrand() {
        System.out.printf("My brand is %s \n", Audi.class.getSimpleName());
    }
}


public class SpringFactory {
    public ICar createCar(String carName){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.discover.amazing.model");
        return (ICar) context.getBean(carName);
    }
 
    public static void main(String[] args) {
        SpringFactory springFactory = new SpringFactory();
        ICar carBean = springFactory.createCar("audi");
        carBean.getBrand();
    }
}

Spring 这个工厂和前面的两种实现方式有没有本质区别呢,必须有,毕竟Spring 这么强大的世界级框架能被成千上万的企业使用有其道理。前面已经提示了,Spring 框架有Spring 容器,Spring 容器在启动的时候已经创建了,所有被@Component注解标注的实体类都会被扫描到放入容器中,下次使用是直接从容器中取出对象,不会再new新的对象。

可见,理解设计模式非常重要,通过设计模式,我们才能更深入的理解各种框架,理解了框架本质和思想,才能利用框架写出高质量的代码。

3.单例模式

Spring 中 bean 的默认作用域就是 singleton(单例)的,spring中单例可谓是随处可见了。

饿汉式

public class Singleton{
private static Singleton instance=new Singleton();
private Singleton (){}

public Singleton getSingleton()
{ return instance;}

}

4.观察者模式

观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主体是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。

二、模式的定义与特点
​ 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。

主要优点

降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。
目标与观察者之间建立了一套触发机制。

它的主要缺点如下:

目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。

当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。

单例设计模式有几种哪种不安全

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值