java基础之设计模式(单例模式,工厂模式)

设计模式

是一种编码套路

单例模式

一个类只能创建一个实例

饿汉式

直接创建唯一实例

复制代码
package com.by.entity;
​
/**
 * 单例模式-饿汉式
 */
public class ClassA {
    //static: 1. newClassA可以访问返回 2. 静态属性内存中只会存在一个
    //private: 防止外界直接访问属性
    private static ClassA ca = new ClassA();
​
    //外界获取唯一实例的渠道
    //static:使外界直接通过类名访问
    public static ClassA newClassA(){
        return ca;
    }
​
    //构造私有化-防止外界调用构造创建对象
    private ClassA(){
​
    }
}

缺点: 有可能浪费空间

懒汉式

在获取实例是创建唯一对象

复制代码
package com.by.entity;
​
/**
 * 单例模式-懒汉式
 */
public class ClassB {
    //static: 1. newClassA可以访问返回 2. 静态属性内存中只会存在一个
    //private: 防止外界直接访问属性
    private static ClassB cb = null;
​
    //外界获取唯一实例的渠道
    //static:使外界直接通过类名访问
    //synchronized: 同步方法  预防线程安全问题
    public static synchronized ClassB newClassB(){
        
        if (cb == null) {//当第一次获取时再进行实例化 
            cb = new ClassB();
        }
        return cb;
    }
​
    //构造私有化-防止外界调用构造创建对象
    private ClassB(){
​
    }
​
}

缺点: 线程效率慢

懒汉式-进阶版

在懒汉式的基础上,利用同步代码块结合二次校验提高执行效率

复制代码
package com.by.entity;
​
/**
 * 单例模式-懒汉式进阶版
 */
public class ClassC {
    //static: 1. newClassA可以访问返回 2. 静态属性内存中只会存在一个
    //private: 防止外界直接访问属性
    private static ClassC cc = null;
​
    //外界获取唯一实例的渠道
    //static:使外界直接通过类名访问
    public static ClassC newClassC(){
        if (cc == null) {//二次校验: 决定是否需要开启互斥锁 t1:true  t2:true
            synchronized (ClassC.class) {//临界资源对象: 当前类的类对象
                //对属性进行实例化
                if (cc == null) {//当第一次获取时再进行实例化
                    cc = new ClassC();
                }
            }
        }
        return cc;
    }
​
    //构造私有化-防止外界调用构造创建对象
    private ClassC(){
​
    }
​
}package com.by.entity;
​
/**
 * 单例模式-懒汉式进阶版
 */
public class ClassC {
    //static: 1. newClassA可以访问返回 2. 静态属性内存中只会存在一个
    //private: 防止外界直接访问属性
    private static ClassC cc = null;
​
    //外界获取唯一实例的渠道
    //static:使外界直接通过类名访问
    public static ClassC newClassC(){
        if (cc == null) {//二次校验: 决定是否需要开启互斥锁 t1:true  t2:true
            synchronized (ClassC.class) {//临界资源对象: 当前类的类对象
                //对属性进行实例化
                if (cc == null) {//当第一次获取时再进行实例化
                    cc = new ClassC();
                }
            }
        }
        return cc;
    }
​
    //构造私有化-防止外界调用构造创建对象
    private ClassC(){
​
    }
​
}

工厂模式

  • 是一种底层技术,通常用于底层框架的编写

  • 思路: 将数据的创建和维护交由工厂完成

案例
  • 需求: 构建一个工厂类,获取学生对象
  1. 提供学生类

    复制代码
    package com.by.entity;
    ​
    public class Student {
        private String name;
        private int age;
        private double score;
    ​
        public String getName() {
            return name;
        }
    ​
        public void setName(String name) {
            this.name = name;
        }
    ​
        public int getAge() {
            return age;
        }
    ​
        public void setAge(int age) {
            this.age = age;
        }
    ​
        public double getScore() {
            return score;
        }
    ​
        public void setScore(double score) {
            this.score = score;
        }
    ​
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", score=" + score +
                    '}';
        }
    ​
        public Student() {
        }
    ​
        public Student(String name, int age, double score) {//string,int,double
            this.name = name;
            this.age = age;
            this.score = score;
        }
    }
  2. 书写配置文件

    • 在项目下创建后缀名为.properties的配置文件

    • 作用: 存放被管理类的全限定名

    • 键=值的形式存放数据

    • 键值不可添加双引号、末尾不可添加分号、中间不可存在多个符号(如空格)

    • 一行只能有一个键值对

    复制代码
    StudentClassName=com.by.entity.Student
  3. 书写工厂类

    复制代码
    package com.by.util;
    ​
    import com.by.entity.Student;
    ​
    import java.io.FileInputStream;
    import java.util.Properties;
    ​
    public class MyFactory {
        /**
         * 获取学生对象
         */
        public static Student getStudent(){
            Student student = null;
            try (
                    //创建输入流
                    FileInputStream fis=new FileInputStream("factory.properties")
                    ) {
                //将配置文件的内容加载到集合中
                Properties p = new Properties();
                p.load(fis);
                //获取全限定名
                String className = p.getProperty("StudentClassName");
                //获取类对象
                Class c = Class.forName(className);
                //利用反射构建学生实例
                student = (Student) c.newInstance();
            } catch (Exception e) {
                System.out.println("未知异常!");
                e.printStackTrace();
            }
            return student;
    ​
        }
    }
    ​
  4. 测试

    复制代码
    package com.by.test;
    ​
    import com.by.entity.Student;
    import com.by.util.MyFactory;
    ​
    public class Test5 {
        public static void main(String[] args) {
            //利用工厂获取学生实例对象
            Student s1 = MyFactory.getStudent();
            Student s2 = MyFactory.getStudent();
    ​
        }
    }
    ​
相关推荐
_F_y10 分钟前
C++重点知识总结
java·jvm·c++
打工的小王12 分钟前
Spring Boot(三)Spring Boot整合SpringMVC
java·spring boot·后端
毕设源码-赖学姐13 分钟前
【开题答辩全过程】以 高校体育场馆管理系统为例,包含答辩的问题和答案
java·spring boot
我真会写代码15 分钟前
SSM(指南一)---Maven项目管理从入门到精通|高质量实操指南
java·spring·tomcat·maven·ssm
vx_Biye_Design15 分钟前
【关注可免费领取源码】房屋出租系统的设计与实现--毕设附源码40805
java·spring boot·spring·spring cloud·servlet·eclipse·课程设计
DN金猿21 分钟前
接口路径正确,请求接口却提示404
java·tomcat
Maynor9961 小时前
OpenClaw 玩家必备:用 AI 自动追踪社区最新动态
java·服务器·人工智能
堕2741 小时前
java数据结构当中的《排序》(一 )
java·数据结构·排序算法
亓才孓1 小时前
[Class的应用]获取类的信息
java·开发语言
开开心心就好1 小时前
AI人声伴奏分离工具,离线提取伴奏K歌用
java·linux·开发语言·网络·人工智能·电脑·blender