单列设计模式

一、学习目的

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。它可以保证唯一的实例。单例模式因为是唯一实例,这样它可以严格地控制用户怎样访问它以及何时访问它。简单地说就是对唯一实例的受控访问。

二、学习内容

1,如何实现单列设计模式

(1)将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。确保实例的唯一性
(2)在该类内部创建一个唯一的实例化对象,并且将其封装为private static类型。
(3)定义一个静态方法返回这个唯一实例对象

2,单列设计模式的两种实现方式

(1)“饿汉模式” 静态初始化的方式是在自己被加载时就将自己实例化,所以被形象地称之为饿汉式单例模式

class Poker{
//default,shareInstance,manager
//2,定义一个静态成员变量 记录这个单列对象
//恶汉
public static final Poker shared = new Poker();
//私有化构造函数
private Poker(){}

// 静态方法返回该实例
public static Poker getInstance() {
    return shared;
}

优点:实现起来简单,没有多线程同步问题
缺点:耗费内存

(2)“懒汉模式”要在第一次被引用时,才会将自己实例化,所以就被称为懒汉式单例模式。

class Player{
public int count;
//1,私有化2,创建静态变量
public static Player shared = null;
//私有化构造方法
private Player(){}
public static Player getInstance(){
        if (shared == null) {
            //如果没有创建 那么久创建一个
            shared = new Player();
        }
    return shared;
  }
}

优点:节约内存
缺点:在多线程环境中,这种实现方法是错误的,不能保证单例的状

(3)如何解决“懒汉模式”多线程的问题?
可以给进程一把锁来处理。synchronized是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。

class Player{
public int count;
//1,私有化2,创建静态变量
public static Player shared = null;
//私有化构造方法
private Player(){}
public static Player getInstance(){
    Object b = new Object();
    synchronized (b) {
        if (shared == null) {
            //如果没有创建 那么久创建一个
            shared = new Player();
        }
    }
    return shared;
 }
}
2,ArrayList线性表

1,线性表:另个或多个具有相同类型的数据元素的有限序列。
2,ArraysLis

  ArrayList persons = new ArrayList();

线性表 , 里面是泛型 表里面只能存放Person类的对象
3,数组里面保存的的都是对象的引用(指针)
注意:改变数组里面对象的属 ,原始对象的值也跟着改变,因为大家都是指向同一个内存空间
4,获取数组的大小

    //获取数组元素个数
    persons.size();

5,向数组里面添加元素

    //添加对象
    Person xw = new Person();
    persons.add(xw);

6,访问数据

    //访问数据
    Person xw2 = persons.get(0);
    xw2.name = "xiaowang";
    System.out.print(xw2.name);
3,打印类的对象

当打印一个对象的时候 就会默认去调用对象的toString方法,如果当前类里面没有实现这个方法 就会到父类里面去查找,Object(所有类都继承Object类) 里面的默认实现就是打印这个对象的首地址

@Override
 public String toString() {
    String pkString ="";
    if(poker != null)
        pkString = poker.getDot()+poker.getType().getPic();
    }
    return id+"号玩家"+name+"筹码"+money;
}

三、学习感悟

今天的主要任务是写一个扑克牌游戏,一个比较难的项目,给我的感觉就是非常复杂,跟着老师写的时候逻辑思维有点跟不上老师的节奏,让人怀疑人生。写完之后再去分析感觉有那么点明白但是又觉得明白的不透彻,我觉得最重要的原因是在这方面练习的太少了,所以才会有那种似是而非的感觉。