单例设计模式(单实例)
核心:在程序运行当中,无论你怎么创建该对象,该对象有且只有一个存在
单例传值
写单例对象思路:
1.对象不能让用户来创建(不能在本类以外创建)
2.对象应该在类的内部来创建
3.开放一个让用户在类外面,能拿到对象的方法
分为饿汉式和懒汉式单例
饿汉式单例:不管使用不使用开放的方法,都会将这个单例对象创建出来
懒汉式单例(双锁):只有第一次调用开放的方法,单例对象才会创建出来(延迟创建)
区别:创建单例对象的时机不同
饿汉式例子
// 饿汉式
class SingleE{
// 自己创建对象
private static SingleE singleE = new SingleE();
// 构造方法私有化
private SingleE() {
}
// 开放一个方法 让外界能拿到对象
// 外界不可能创建出对象 来调用成员方法
// 所以要使用静态方法
public static SingleE getInstance() {
return singleE;
}
懒汉式例子
// 不完整的懒汉式单例(出现线程问题)
class SingleL{
// 声明一个本类对象的引用
private static SingleL singleL = null;
// 私有化构造方法
private SingleL() {
}
// 开放访问的方法
public static SingleL getInstance() {
// 判断
if (singleL == null) {
// 创建对象
singleL = new SingleL();
}
// 直接返回对象
return singleL;
}
}
抽象
- 抽象:不知道该怎么具体描述该事物
- 关键词:abstract
- 修饰类 抽象类
- 修饰方法 抽象方法
注意:
- 1.抽象方法 没有实现部分
- 2.抽象方法 必须在抽象类中 才能声明
- 3.抽象类中 可以没有抽象方法
- 4.抽象类 不能直接创建对象 可以使用多态的形式创建对象
- 5.继承抽象类 子类必须实现 抽象类中的抽象方法
抽象类中可以有
- 1.常量 变量
- 2.抽象方法
- 3.成员方法
- 4.构造方法
思考
1.抽象类能不能创建对象?
答:不能
2.抽象类有没有构造方法?
答:有
3.抽象类该如何使用?
实例:
public static void main(String[] args) {
Animal animal = new Cat();
animal.eat();
// 向下转型
Cat cat = (Cat)animal;
cat.zLs();
}
}
abstract class Animal{
// 声明抽象方法吃
public abstract void eat();
public Animal() {
}
}
class Cat extends Animal{
// 实现抽象方法
public void eat() {
System.out.println("猫吃鱼");
}
public void zLs() {
System.out.println("抓老鼠");
}
}
注意:abstract 关键字不能与哪些关键字共存?
- private 修饰抽象方法,子类不能实现,抽象方法没有意义
- final 修饰成员方法,不能被重写,抽象方法没有意义
- static 修饰抽象方法就可以直接使用类名调用,但是抽象方法没有实现部分
模板设计模式
- 当你的程序大部分代码都相同,只有少部分需要修改时,可以使用模板设计模式(利用抽象类)
实例
abstract class SuDa{
// 学习
public void study() {
System.out.println("报名缴费");
// 选择学科
chooseSubject();
System.out.println("找工作");
}
// 抽象方法
public abstract void chooseSubject();
}
class CL extends SuDa{
public void chooseSubject() {
System.out.println("H5");
}
}
class FZM extends SuDa{
public void chooseSubject() {
System.out.println("JAVA");
}
}
接口
狭义:
使用关键字 interface 来定义接口
格式: interface 接口名{ }广义:接口相对于一个规范,需要人来遵守
注意:
- 1.使用接口时,不是用的继承,需要使用关键词 implements (实现)
- 2.接口类不能直接创建对象
- 3.接口类不能声明成员方法
- 4.接口类不能声明构造方法
5.使用多态的方式来创建对象
接口可以写:
- 1.只能写抽象方法,并且可以省略 public abstract 两个关键词
- 2.只能写静态常量,并且省略 public static final 三个关键词
谨记:
- 实现类的类名命名,后缀加Impl