单例模式、多例模式、枚举、工厂模式

单例模式、多例模式、枚举、工厂模式

第一章 单例设计模式

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); ....
56:
	单列集合:
		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.自定义异常
            
89多线程
   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 枚举名{枚举项名,枚举项名,枚举项名;}            
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值