如何在单例中获取对象?

时间:2018-10-22 20:43:21

标签: java singleton

我创建了一个公共函数method(),它在类Singleton(HouseCreator)内定义,用于添加新对象。但是我不知道如何在其中调用或获取对象。

谢谢!

这是我的源代码:

这是我的主班>

public class TestSingleton {
    public static void main(String[] args) {
             HouseCreator hc = HouseCreator.getInstance();
              House h1 = hc.createHouse("A5B6","red");
              House h2 = hc.createHouse("GP44","blue");               
    }
}

class HouseCreator{
    private static HouseCreator instance = new HouseCreator();
    private HouseCreator(){
    }
    public static HouseCreator getInstance(){
        return instance;
    }
    public House createHouse(String address,String color){
       boolean alreadyCreate = true;
        if(alreadyCreate){
            return null;
        }else{
        return new House(address, color);
        }
    }
}

class House{
    private String address;
    private String  color;

    public House() {
    }

    public House(String address, String color) {
        this.address = address;
        this.color = color;
   }
    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

2 个答案:

答案 0 :(得分:0)

如果目的是永远不要创建两次 same House,那么就不要实例化2个外观和颜色相同的房屋,可以将它们存储在{{1 }}

如果您要查找的房子已经在列表中,您将得到它(新的即时实例将被丢弃),如果不保留,请立即将其添加到列表中

List

然后在class HouseCreator{ private static HouseCreator instance = new HouseCreator(); private List<House> houses; private HouseCreator(){ houses = new ArrayList<>(); } public static HouseCreator getInstance(){ return instance; } public House createHouse(String address,String color){ House h = new House(address, color); int indexOf = houses.indexOf(h); if(indexOf < 0){ houses.add(h); return h; }else{ return houses.get(indexOf); } } } 类中添加House方法

equals

答案 1 :(得分:-1)

您需要将自己创建的房屋存储在某个地方。

它们是根据地址和颜色创建的-这是关键,这是您需要跟踪它们的方式:

import java.util.HashMap;
import java.util.Map;

class HouseCreator {
    private static HouseCreator instance = new HouseCreator();

    private final Map<HouseKey, House> createdHouses = new HashMap<>();

    private HouseCreator() {
    }

    public static HouseCreator getInstance() {
        return instance;
    }

    public House createHouse(String address, String color) {
        return createdHouses.computeIfAbsent(new HouseKey(address, color), x -> new House(address, color));
    }
}

class HouseKey {
    private String address;
    private String color;

    public HouseKey(String address, String color) {
        this.address = address;
        this.color = color;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((address == null) ? 0 : address.hashCode());
        result = prime * result + ((color == null) ? 0 : color.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        HouseKey other = (HouseKey) obj;
        if (address == null) {
            if (other.address != null)
                return false;
        } else if (!address.equals(other.address))
            return false;
        if (color == null) {
            if (other.color != null)
                return false;
        } else if (!color.equals(other.color))
            return false;
        return true;
    }

}

class House {
    private String address;
    private String color;

    public House() {
    }

    public House(String address, String color) {
        this.address = address;
        this.color = color;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}