单例模式在日常编程中的优先级还是比较高的。具体的优点就是:1.减少资源生成销毁的开销;2.想到了古代中央集权的管理方法,统一权力,集中管理;3.防止出现多个实例去操作,导致丢失操作或者冲突死锁的问题。
其实只要在编写程序的时候确保只调用一次new MyClass(),就可以达到只生成一个实例的目的。但是如果不想要一直去注意这个,就需要:

  • 确保任何情况下都绝对只有1个实例;
  • 想在程序上表现出“只存在一个实例”
  1. 首先在Singleton类中定义了static修饰的singleton类的实例,初始化行为只会在类被加载时进行一次,保证了值实例化一次。
  2. Singleton的构造函数是private修饰的,代表着其禁止从外部调用构造函数进行实例化对象。又是对于一次实例化的保证。
  3. 定义一个public修饰的获取实例,在被调用时返回唯一的一个实例对象。
    1. public static Singleton getInstance(){
    2. return singleton;
    3. }
    在很多设计模式中,多数情况下也只会生成一个实例对象,例如:
  • AbstractFactory模式
  • Builder模式
  • Facade模式
  • Prototype模式

    习题:

  1. 创建一个买票类,从1000开始卖,单例模式; ```java public class TicketMarket { private int ticket = 1000; private static TicketMarket singleton = new TicketMarket(); private TicketMarket(){

    } public static TicketMarket getInstance(){

    1. return singleton;

    } public synchronized int getNextTicketNumber(){

    1. return ticket++;

    }

}

  1. 2. 创建一下Triple类,实现最多只能生成3Triple类的实例,实例编号分别为123
  2. ```java
  3. public class Triple {
  4. private static Triple[] triples = new Triple[]{
  5. new Triple(0),
  6. new Triple(1),
  7. new Triple(2),
  8. };
  9. private int id;
  10. private Triple(int id){
  11. System.out.println("The instance"+id+"is create");
  12. this.id = id;
  13. }
  14. public static Triple getInstance(int id){
  15. return triples[id];
  16. }
  17. public String toString(){
  18. return "[Triple id="+id+"]";
  19. }
  20. }
  1. Singleton模式寻找问题。

    1. public class Singleton_error {
    2. private static Singleton_error singletonError = null;
    3. private Singleton_error(){
    4. System.out.println("生成了一个实例对象");
    5. }
    6. public static Singleton_error getInstance(){
    7. if(singletonError==null){
    8. singletonError = new Singleton_error();
    9. }
    10. return singletonError;
    11. }
    12. }
    1. public class Main extends Thread{
    2. public static void main(String[] args) {
    3. System.out.println("start");
    4. new Main("A").start();
    5. new Main("B").start();
    6. new Main("C").start();
    7. System.out.println("end");
    8. }
    9. public void run(){
    10. Singleton_error instance = Singleton_error.getInstance();
    11. System.out.println(getName()+":obj="+instance);
    12. }
    13. public Main(String name){
    14. super(name);
    15. }
    16. }

    这样做的时候会生成多个实例对象,而加入synchronized可以解决多个线程同时,同时判断的问题。