Java认识设计模式
发布日期:2021-04-30 21:01:48 浏览次数:105 分类:精选文章

本文共 3655 字,大约阅读时间需要 12 分钟。

Java认识设计模式

一、什么是设计模式?

设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是经过长时间的实践总结而来的,能够帮助开发人员解决常见问题,提高代码复用性和可维护性。设计模式是一套被普遍使用、经过分类的代码设计经验总结,能够为多数开发人员提供参考。

二、设计模式的作用

使用设计模式的目的是为了重用代码、提高代码的可维护性和可靠性。通过模式的引入,可以使代码结构更加清晰,便于理解和扩展。

三、单例模式/单态模式

单例模式的作用是保证一个类仅有一个实例。在频繁创建与销毁类实例时,单例模式可以减少内存占用,避免资源浪费。

单例模式的两种实现方式

  • 懒汉式

    • 构造方法私有。
    • 提供一个静态成员变量用于保存当前类对象。
    • 提供一个静态方法返回创建好的当前类对象。
    • 在多线程情况下,为了保证只有一个实例,添加synchronized关键字。
  • 饿汉式

    • 构造方法私有。
    • 提供一个静态成员变量提前创建当前类对象。
    • 提供一个静态方法返回当前类对象。
    • 在多线程情况下也需要添加synchronized关键字。
  • 区别

    资源利用率 懒汉式 饿汉式
    运行速度

    四、工厂模式

    工厂模式的定义是一个创建对象的接口,让子类决定使用哪一个工厂类来创建对象。工厂模式的特点是创建过程延迟到子类,适用于需求量大、牵一发动全身的场景。

    工厂模式的三个角色:

  • 工厂角色(普通类)
  • 抽象产品角色(抽象类/接口)
  • 具体产品角色(抽象类/接口子类)
  • 例如:农场生产水果(西瓜、苹果、香蕉),农场是工厂角色,水果是抽象产品角色,西瓜、苹果、香蕉是具体产品角色。

    五、如何编写简单工厂模式?

    简单工厂模式的实现

    // 工厂类public class Factory {    public Product createProduct(String type) {        if (type.equals("A")) {            return new ProductA();        } else if (type.equals("B")) {            return new ProductB();        } else {            return null;        }    }}// 产品接口public interface Product {    void show();}// 具体产品类public class ProductA implements Product {    @Override    public void show() {        System.out.println("产品A");    }}public class ProductB implements Product {    @Override    public void show() {        System.out.println("产品B");    }}// 测试类public class Test {    public static void main(String[] args) {        Factory factory = new Factory();        Product product = factory.createProduct("A");        product.show();        product = factory.createProduct("B");        product.show();    }}

    六、代理模式

    1. 静态代理

    静态代理通过手动创建子类实现目标接口的方法来实现。代理类与目标类具有相同的接口,但实现方式不同。

    例如:

    public interface SellPiaoService {    void maipiao();}public class HuoCheZhan implements SellPiaoService {    @Override    public void maipiao() {        System.out.println("我家离火车站近,我就去火车站买票");    }}public class DaiShouDian extends HuoCheZhan {    @Override    public void maipiao() {        System.out.println("我家离火车站远,我就去代售点买票");    }}public class TestMain {    public static void main(String[] args) {        HuoCheZhan cheZhan = new HuoCheZhan();        cheZhan.maipiao();        DaiShouDian daiShouDian = new DaiShouDian();        daiShouDian.maipiao();    }}

    2. 动态代理

    动态代理通过Java反射机制动态生成代理类,适用于需要对多个目标类进行统一处理的情况。

    public interface SellPiaoService {    void maipiao();}public class HuoCheZhan implements SellPiaoService {    @Override    public void maipiao() {        System.out.println("我家离火车站近,我就去火车站买票");    }}public class DaiShouDian implements SellPiaoService {    @Override    public void maipiao() {        System.out.println("我家离火车站远,我就去代售点买票");    }}public class CreateDaiShouDianObject implements InvocationHandler {    private Object targetObject;    public CreateDaiShouDianObject(Object targetObject) {        this.targetObject = targetObject;    }    public Object getProxyObject() {        return Proxy.newProxyInstance(            this.getClass().getClassLoader(),            targetObject.getClass().getInterfaces(),            this        );    }    public Object invoke(Object proxy, Method method, Object[] args)        throws Throwable {        return method.invoke(targetObject, args);    }}public class TestMain {    public static void main(String[] args) {        HuoCheZhan cheZhan = new HuoCheZhan();        CreateDaiShouDianObject createDaiShouDianObject = new CreateDaiShouDianObject(chewZhan);        SellPiaoService proxy = (SellPiaoService) createDaiShouDianObject.getProxyObject();        proxy.maipiao();    }}

    JDK动态代理与CGlib代理的区别

    JDK动态代理

    • 通过反射生成代理类。
    • 适用于实现接口的类。

    CGlib动态代理

    • 依赖第三方库,需要导入CGlib。
    • 适用于任何Java类。

    总结

    设计模式是软件开发中的重要概念,能够帮助开发人员解决常见问题,提高代码复用性和可维护性。单例模式用于控制对象实例数量,工厂模式用于统一对象创建逻辑,代理模式用于间接操作复杂对象。通过合理选择和应用设计模式,可以提升代码质量和开发效率。

    上一篇:JavaWeb概述
    下一篇:Collections工具类

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2026年06月10日 00时07分57秒