Java基础十 - 设计模式

这篇具有很好参考价值的文章主要介绍了Java基础十 - 设计模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、单例

1. 创建
  • 饿汉式
package basic;

public class ESingleton {
    // 先私有化静态实例
    private static ESingleton eSingleton = new ESingleton();
    // 私有化构造方法,防止外部实例化
    private ESingleton(){};

    // 提供全局访问方法
    public static ESingleton geteSingleton(){
        return eSingleton;
    }

}
  • 懒汉式
package basic;

public class LazySingleton {
    // 创建私有静态实例,null
    private static LazySingleton lazySingleton = null;
    // 私有构造方法,防止外部实例化
    private LazySingleton(){};
    // 提供全局访问点,使用同步方法解决线程安全问题
    public static synchronized LazySingleton getLazySingleton(){
        if (lazySingleton == null){
            lazySingleton = new LazySingleton();
        }
        return lazySingleton;
    }
}
2. 区别
1. 饿汉式是在实例化私有静态类加载时就创建,不管是否需要用;
2. 懒汉式是在实例加载时声明但是木有创建,只有外部调用get需要用的时候才会创建
    需要注意线程安全

二、观察者模式

1. 创建及概念
  • 概念
1. 观察者模式是1对多,其中1发生变化后会自动通知,也能感知到变化
2. 例如:假设有三个人,小美(女,22),小王和小李。小美很漂亮,小王和小李是两个程序猿,时刻关注着小美的一举一动。有一天,小美说了一句:“谁来陪我打游戏啊。”这句话被小王和小李听到了,结果乐坏了,蹭蹭蹭,没一会儿,小王就冲到小美家门口了,在这里,小美是被观察者,小王和小李是观察者,被观察者发出一条信息,然后观察者们进行相应的处理
  • 创建
    • 写一个接口用于获取消息
package basic.pattern;

public interface Person {
    // 用于获取消息
    void getMessage(String s);
}
  •  声明3个人的类
package basic.pattern;

public class Li implements Person {
    private static String name = "Xiao Li";

    public Li(){};

    @Override
    public void getMessage(String s) {
        System.out.println(name + "收到消息" + s);
    }
}

  

package basic.pattern;

public class Wang implements Person{
    private static String name = "Xiao Wang";
    public Wang(){};

    @Override
    public void getMessage(String s){
        System.out.println(name + "收到消息: " + s);
    }
}
package basic.pattern;

import java.util.ArrayList;
import java.util.List;

public class Mei {
    List<Person> list = new ArrayList<Person>();

    public Mei(){};
    public void addPerson(Person person){
        list.add(person);
    }

    //遍历list,把自己的通知发送给所有暗恋自己的人
    public void notifyPerson(){
        for (Person person:list){
            //主要这一步,调用对应人的getMessage方法,达到通知的目的
            person.getMessage("Come here!");
        }
    }


}
  • 测试
package basic.pattern;

public class TestObserverPattern {
    public static void main(String[] args) {
        Mei mei = new Mei(); //执行这个的时候已经执行了List<Person> list = new ArrayList<Person>();

        Li li = new Li();
        Wang wang = new Wang();

        mei.addPerson(li);
        mei.addPerson(wang);

        mei.notifyPerson();
    }
}

输出:

Xiao Li收到消息Come here!
Xiao Wang收到消息: Come here!

三、适配器模式

1. 概念

将两种完全不同的事物联系到一起,就像现实生活中的变压器。假设一个手机充电器需要的电压是20V,但是正常的电压是220V,这时候就需要一个变压器,将220V的电压转换成20V的电压,这样,变压器就将20V的电压和手机联系起来了。

2. 创建

package basic.pattern;

public class AdapterTest {
    public static void main(String[] args) {
        System.out.println();
        Phone phone = new Phone();
        VoltageAdapter adapter = new VoltageAdapter();
        phone.setAdapter(adapter);
        phone.charge();
    }

    // 手机类
    static class Phone {
        public static final int V = 220; // 原始常量
        private VoltageAdapter adapter;

        // 充电
        public void charge() {
            adapter.changeVoltage();
        }

        public void setAdapter(VoltageAdapter adapter) {
            this.adapter = adapter;
        }
    }

    // 变压器类
    static class VoltageAdapter {
        public void changeVoltage() {
            System.out.println("正在充电");
            System.out.println("原始电压是:" + Phone.V + "V");
            System.out.println("变压后电压是:" + (Phone.V - 200) + "V");
        }
    }
}

说明:

1. Phone(手机类):

这个类表示手机。在充电时,手机需要一个适配器来转换电压。
V 是手机需要的电压,初始值为 220V。
charge() 方法是手机充电的方法,调用适配器的方法来改变电压。

2.VoltageAdapter(变压器类):

这个类表示电压适配器,用于将原始电压转换成适合手机的电压。
changeVoltage() 方法改变电压,输出充电信息,原始电压和转换后电压。

3. AdapterTest(适配器测试类):

main 方法创建了一个手机和一个电压适配器的实例。
phone.setAdapter(adapter) 将适配器设置给手机。
phone.charge() 调用手机的充电方法,实际上会调用适配器的电压转换方法。

四、工厂模式

1. 简介

工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的方式,
将对象的创建与使用分离。工厂模式通过使用一个共同的接口来创建不同类型的对象,
使得客户端代码不需要直接依赖于具体类的实例化。

说白了就是把创建对象和使用分离,降低耦合

封装了对象的创建过程,客户端只需要调用工厂方法,而不需要关心对象的具体创建细节。
降低了客户端和具体类之间的耦合,使得代码更加灵活和可维护。

2. 上代码

创建Car的接口,实名有哪些方法

package basic.pattern;

public interface Car {
    public void run();
    public void stop();
}
package basic.pattern;

class Benz implements Car{

    @Override
    public void run() {
        System.out.println("Benz is running");
    }

    @Override
    public void stop() {
        System.out.println("Benz is stopping");

    }
}

class Ford implements Car{

    @Override
    public void run() {
        System.out.println("Ford is running");
    }

    @Override
    public void stop() {
        System.out.println("Ford is stopping");
    }
}

class Factory{
    public static Car getCarInstance(String carType){
        Car c = null;
        if (carType.equals("Benz")){
            c = new Benz();
        }
        if (carType.equals("Ford")){
            c = new Ford();
        }
        return c;
    }
}


class Test{
    public static void main(String[] args) {
        Car c = Factory.getCarInstance("Benz");
        if(c != null){
            c.run();
            c.stop();
        }else {
            System.out.println("造不了这种汽车。。。");
        }
    }

        }

未完待续~~~~文章来源地址https://www.toymoban.com/news/detail-648969.html

到了这里,关于Java基础十 - 设计模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java基础教程】(十五)面向对象篇 · 第九讲:抽象类和接口——定义、限制与应用的细节,初窥模板设计模式、工厂设计模式与代理设计模式~

    掌握 抽象类和接口的定义、使用、区别、常见设计模式; 抽象类是代码开发中的重要组成部分,利用抽象类可以明确地定义子类需要覆写的方法,这样相当于在语法程度上对子类进行了严格的定义限制,代码的开发也就更加标准。下面具体介绍抽象类的概念。 普通类可以直

    2024年02月16日
    浏览(48)
  • 【策略设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    策略模式(Strategy Pattern)属于行为型设计模式。将每一个算法封装到具有共同接口的独立类中,根据需要来绑定策略,使得具体实现和策略解耦。 当你想使用对象中各种不同的算法变体,使用if...else 所带来的复杂和难以维护,可使用策略模式。或者当有许多相同类,它们仅

    2024年02月01日
    浏览(46)
  • 【代理设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    代理模式(Proxy Pattern)是一种结构型设计模式,用一个类来代理另一个类或几个类的功能。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 延迟初始化(虚拟代理)。如果你有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源

    2023年04月25日
    浏览(89)
  • 【原型设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    原型模式(Prototype Pattern)是一种创建型设计模式,使你能够复制已有对象,而无需使代码依赖它们所属的类,同时又能保证性能。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。 如果你需要复制一些对

    2023年04月24日
    浏览(84)
  • 【单例设计模式原理详解】Java/JS/Go/Python/TS不同语言实现

    单例模式(Singleton Pattern)属于创建型设计模式,这种模式只创建一个单一的类,保证一个类只有一个实例,并提供一个访问该实例的全局节点。 当您想控制实例数目,节省系统资源,并不想混用的时候,可以使用单例模式。单例有很多种实现方式,主要分为懒汉和饿汉模式

    2023年04月27日
    浏览(93)
  • 【迭代器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    迭代器模式(Iterator Pattern),是一种结构型设计模式。给数据对象构建一套按顺序访问集合对象元素的方式,而不需要知道数据对象的底层表示。 迭代器模式是与集合共存的,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像Java中的Collection,List、Set、Map等

    2023年04月17日
    浏览(49)
  • 【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    模板方法模式(Template Method Pattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。不同的子类以不同的方式实现这些抽象方法

    2024年02月01日
    浏览(86)
  • 【享元设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    享元模式(Flyweight Pattern),是一种结构型设计模式。主要用于减少创建对象的数量,以减少内存占用和提高性能。它摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。 当程序需要生成数量巨大的相似

    2023年04月10日
    浏览(39)
  • 【访问者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    访问者模式(Visitor Pattern)是一种行为型模式。它封装一个访问者类,把各元素类的操作集合起来,目的是将数据结构与数据操作分离。在不改变原有元素类数据结构的前提下,改变了元素类的执行算法。 当某些较为稳定的东西(数据结构或算法),不想直接被改变但又想扩

    2024年02月02日
    浏览(81)
  • 【解释器设计模式详解】C/Java/Go/JS/TS/Python不同语言实现

    解释器模式(Interpreter Pattern)是一种行为型设计模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式常被用在 SQL 解析、符号处理引擎等。 解释器模式常用于对简单语言的编译或分析实例中,为了掌握好它的结构与实现,必须先了解编译原理中的

    2023年04月12日
    浏览(233)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包