天天看点

Java Factory概念学习第一课 (单例、多例)单例的概念多例的概念

Java Factory概念学习第一课 (单例、多例)

  • 单例的概念
  • 多例的概念

单例的概念

对于一个Car类:

public class Car{

    public void run(){

       System.out.println("汽车突突突地跑");

    }

}
           

另一个类来获得Car,也就是实例化这个Car,:

public class Test{

     public static void main(String[] args){

          Car car = new Car();

          car.run();

     }

}
           

此时对于Car类来说,本身并不能限制谁可以或者不可以实例化。此时我们可以这样做:

public class Car{

    private Car(){}

    public Car getInstance(){

        return new Car();

    }

    public void run(){

       System.out.println("汽车突突突地跑");

    }

}
           

将构造方法声明为私有,那么Test类只能通过getInstance来实例化Car对象,那么我们就可以在getInstance方法里加入验证和限制来进行约束。

现在,Car类本身并不能控制或者限制Test类示例几个Car对象,假设我们限制只能获得一台车,那么可以这样做:

public class Car{

    private Car(){}

    private static Car car = new Car();

    public Car getInstance(){

        return car;

    }

    public void run(){

       System.out.println("汽车突突突地跑");

    }

}
           

那么,无论Test类调用多少次getInstance方法,都只会返回同一个car。

public class Test{
  public static void main(String[] args){
    Car c = Car.getInstance();
    Car c2 = Car.getInstance();
    System.out.println(c == c2);
  }
}
           

结果输出为true,即两个对象c和c2指向同一个地址,即只有一辆小汽车被分配。

这是单例。

多例的概念

自然而然的,我们可以解除只能获得一台车的限制,但是还是要在控制之下完成对象的实例化。

这里我们可以使用多例的办法,在单例的基础上修改一下

public class Car{

    private Car(){}

    private static List<Car> carList = new ArrayList<>();

    for(int i = 0; i < 5; i ++){

       carList.add(new Car());

    }

    public Car getInstance(){

        return carList.get();

    }

    public void run(){

       System.out.println("汽车突突突地跑");

    }

}
           

这样Test类依旧只需要调用getInstance就可以获得实例了。

这就是多例。

下一篇:一般factory