单例模式、多例模式、枚举、工厂模式
第一章 单例设计模式
1. 单例设计模式作用
让一个类,最最最最多只能有一个对象
2. 单例设计模式实现步骤
a.构造方法私有化
b.我们要在类内部,创建一个静态的该类对象
c.我们要提供一个静态方法,用户可以通过静态方法获取刚刚我们准备的那个对象
3 单例设计模式的类型
a.饿汉式单例:
编写静态对象时,直接通过new 类名()赋值
b.懒汉式单例:
编写静态对象时,我们只定义对象,当用户调用getInstance方法,在方法中再创建对象
4, 饿汉单例设计模式
public class Dog {
/**
* 饿汉式,直接在定义Dog对象时,new Dog()对象
*/
private static Dog dd = new Dog();
private Dog(){}
/**
* 提供静态方法,用于获取Dog对象
*/
public static Dog getInstance() {
return dd;
}
}
5. 懒汉单例设计模式
public class Dog {
/**
* 懒汉式,只定义对象,先不创建对象
*/
private static Dog dd;
private Dog() {
}
/**
* 提供静态方法,用于获取Dog对象
*/
public static Dog getInstance() {
//判断 该方法是不是第一次调用
if (dd == null) {
dd = new Dog();
}
return dd;
}
}
第二章 多例设计模式
1. 多例设计模式的作用
让一个类,只能有我们规定个数的对象
2. 多例设计模式的实现步骤
a.将构造方法私有化
b.定义一个静态变量,记录需要的固定对象个数
c.定义一个静态集合,保存固定个数的对象
d.在静态代码块中创建固定个数对象并添加到集合
e.提供一个对外的静态方法用于获取集合中的对象
3. 多例设计模式的代码实现
public class Cat {
// a.将构造方法私有化
private Cat() {
}
// b.定义一个静态变量,记录需要的固定对象个数
private static final int COUNT = 5;
// c.定义一个静态集合,保存固定个数的对象
private static final ArrayList<Cat> list = new ArrayList<Cat>();
// d.在静态代码块中创建固定个数对象并添加到集合
static {
for (int i = 0; i < COUNT; i++) {
list.add(new Cat());
}
}
// e.提供一个对外的静态方法用于获取集合中的对象
public static Cat getInstance() {
Random rd = new Random();
int index = rd.nextInt(list.size());
return list.get(index);
}
}
第三章 枚举
1. 不使用枚举存在的问题
public class Person {
private int age;
private String name;
private String gender;
//省略get/set.无参/全参.toString方法
}
public class TestPersonDemo {
public static void main(String[] args) {
//1.创建Person对象
Person p1 = new Person();
p1.setName("张三");
p1.setAge(18);
p1.setGender("OK");
System.out.println(p1);
//2.创建Person对象
Person p2 = new Person(20,"李四","KO");
System.out.println(p2);
}
}
注意:不使用枚举,给性别赋值时只要是字符串均可,和实际有冲突
2. 枚举的作用与应用场景
a.什么是枚举:
就所有可能出现的结果,一一列举出来
b.应用场景:
比如:性别的结果只有三种,我们就可以枚举一一列举出来
3. 枚举的基本语法
-
定义枚举的格式
定义类: public class 类名{..} 定义接口: public interface 接口名{...} 定义注解: public @interface 注解名{...} 定义枚举: public enum 枚举名{...} 枚举的格式: public enum 枚举名{ //将每种结果,一一列举出来 结果1,结果2,结果3; }
-
枚举的入门案例
/** * 性别枚举 */ public enum Gender { /** * 雄性 */ MALE, /** * 雌性 */ FEMALE } public class Person { private int age; private String name; private Gender gender; //..其他省略 } public class TestPersonDemo { public static void main(String[] args) { //1.创建Person对象 Person p1 = new Person(); p1.setName("张三"); p1.setAge(18); p1.setGender(Gender.FEMALE); System.out.println(p1); //2.创建Person对象 Person p2 = new Person(20,"李四",Gender.MALE); System.out.println(p2); } }
-
枚举的本质(了解)
a.枚举的本质是一个类,所有的枚举都会继承java.lang.Enum这个类 b.枚举项本质是当前类的一个静态常量对象,由public static final修饰 c.枚举的本事是一个类,所以,我们可以给它添加我们自己的构造,自己的成员变量,以及成员方法 /** * 性别枚举 */ public enum Gender { /** * 雄性 */ MALE("男"), /** * 雌性 */ FEMALE("女"); /** * 给枚举添加的自定义成员变量 */ private String detail; private Gender() { } /** * 给枚举添加的自定义构造 */ private Gender(String detail){ this.detail = detail; } /** * 给枚举添加的自定义成员方法 */ public void show(){ System.out.println("性别的描述是:"+detail); } }
-
枚举的应用场景
a.性别可以使用枚举 public enum Sex { MAIL, FEMAIL; } b.枚举表示方向: public enum Orientation { UP, RIGHT, DOWN, LEFT; } c.枚举表示季度 public enum Season { SPRING, SUMMER, AUTUMN, WINTER; } d.五行枚举: public enum WX {JIN,MU,SHUI,HUO,TU} e.生肖枚举: ....
第四章 工厂设计模式
1.工厂模式概述
以前我们创建对象时,需要自己主动通过new关键字创建对象
现在我们可以直接通过工厂模式来获取对象,创建对象的工作交给工厂
2.工厂模式作用
类与类之间实现解耦
3.工厂模式实现步骤
1.编写一个Car接口, 提供run方法
2.编写一个Falali类实现Car接口,重写run方法
3.编写一个Benchi类实现Car接口,重写run方法
4.编写一个AoTuo类实现Car接口,重写run方法
..
5.提供一个CarFactory(汽车工厂),获取汽车对象的方法
6.测试一下汽车工厂类
4.工厂模式实现代码
/**
* 汽车接口
*/
public interface Car {
/**
* 汽车的行驶方法
*/
void run();
}
/**
* 法拉利汽车
*/
public class FaLaLi implements Car {
@Override
public void run() {
System.out.println("法拉利以每小时200公里速度飞驰...");
}
}
/**
* 奔驰汽车
*/
public class BenChi implements Car {
@Override
public void run() {
System.out.println("奔驰以每小时100公里速度奔驰...");
}
}
/**
* 奥迪汽车
*/
public class AoDi implements Car {
@Override
public void run() {
System.out.println("奥迪以每小时50公里行驶着...");
}
}
/**
* 奥拓汽车
*/
public class AoTuo implements Car {
@Override
public void run() {
System.out.println("奥托汽车以每小时10公里推着....");
}
}
/**
* 汽车工厂,提高获取汽车的方法
*/
public class CarFactory {
public static Car getCar(int id) {
//判断id
if (id == 1) {
return new FaLaLi();
} else if (id == 2) {
return new BenChi();
} else if (id == 3) {
return new AoDi();
} else{
return new AoTuo();
}
}
}
public class TestCarDemo {
public static void main(String[] args) {
//1.要一辆汽车
Car car = CarFactory.getCar(2);
car.run();
car = CarFactory.getCar(3);
car.run();
car = CarFactory.getCar(10);
car.run();
}
}
第五章 考试复习
1.继承
2.多态
3.API(Date,"DateFormat",Calendar,Math,System,Arrays,Collection,BigDecimal)
4.String的所有常用方法
trim(); split(String regex); ....
5和6:
单列集合:
Collection 根接口
|- List接口: 有序,有索引,可重复
|- ArrayList: 底层采用数组结构,增删慢 查询快
|- LinkedList: 底层采用连接结构,增删快,查询慢
|- Set接口: 无序(LinkedHashSet除外),无索引,元素唯一
|- HashSet 哈希表(数组+链表+红黑树) 无序,无索引,元素唯一
|- LinkedHashset 链式哈希表(链表+哈希表) 有序,无索引,元素唯一
|- TreeSet 二叉树 查询速度非常恐怖!! 并且是无序的(但是有自然顺序)
双列集合:
Map接口
|- HashMap
|- LinkedHashMap
|- TreeMap
注意: 如果要保证唯一元素的唯一性,必须重写该元素的hashCode和equals方法
7.排序: 冒泡,选择, 二分查找法
异常: a.THrowable --> Exception RuntimeException
b. throws 再次声明抛出 try--catch 捕获处理
c.自定义异常
8和9多线程
a.继承方式和实现方法(使用匿名内部类实现)
b.线程同步代码的三种方式(同步代码块,同步方法,LOck锁)
c.线程状态(无限等待状态)-->吃包子和做包子
d.线程池
e.Lambda以及Stream流
10.
File和递归
字节流: OutputStream,InputStream
字符流: Writer,Reader
11.其他流
缓冲流,转换流.序列化流,打印流(commons-io工具类)
12.Junit单元测试,网络编程中我们需要掌握TCP中的双向通信
13.NIO和AIO
同步和异步
阻塞和非阻塞
14.反射注解
反射: a.获取Class对象 b.获取构造并执行构造 c.获取成员方法并调用成员方法
注解: a.注解格式以及属性格式 b.注解使用@注解名(属性名=属性值)
c.注解的解析(了解) d.元注解(注解的注解@Target @Retension)
动态代理: 了解
JDK8特性: 方法引用 (System.out::println)
15.XML和XML的DOM解析
a.会根据DTD约束和Schema约束编写XML(根据IDEA提示)
b.使用Dom4J解析开发包
理论:Dom解析,全部读取,解析后返回一个Document对象
c.正则表达式:
"普通字符串".match("正则")
"普通字符串".split("正则");
"普通字符串".replaceAll("正则","替换后的字符串")
16.单例(饿汉懒汉)
多例
工厂
枚举: a.使用场景 b.枚举的格式 public enum 枚举名{枚举项名,枚举项名,枚举项名;}