在Java中结合Factory模式实现Singleton模式的最佳方法是什么?描述中的细节

时间:2016-10-09 15:32:35

标签: java design-patterns singleton factory-pattern

我正在学习JAVA的设计模式。我想用单件工厂模式。现在我不确定我是否采用了正确的方法。

让我先分享一下我的尝试。 我使用Button作为示例类。目标是获得Button的singleInstance然后获得它的颜色。任何人都可以告诉我它是否可用于实际实施?我错过了什么或更好的方法吗?

这是我的代码:

Button.java

public abstract class Button {
    abstract void getButton();
}

ButtonClientClass.java

public class ButtonClientClass {
public static void main(String[] args){
    Button red = ButtonFactory.getButton("RedButton");
    red.getButton();
    System.out.println("hashcode"+red.hashCode());
    Button red2 = ButtonFactory.getButton("RedButton");
    System.out.println("hashcode"+red2.hashCode());

    Button green = ButtonFactory.getButton("GreenButton");
    green.getButton();
    System.out.println("hashcode"+green.hashCode());
    Button green2= ButtonFactory.getButton("GreenButton");
    System.out.println("hashcode"+green2.hashCode());
}
}

ButtonFactory.java

public class ButtonFactory {
public static Button getButton(String button){
    if(button.equals("RedButton")){
        return RedButton.getSingleRedButton();      
    }else{
        return GreenButton.getSingleGreenButton();
    }
}
}

GreenButton.java

public class GreenButton extends Button{

    private static class GreenButtonHolder {
        public static GreenButton INSTANCE = new GreenButton();
    }
    private GreenButton(){}
    public static GreenButton getSingleGreenButton(){
        return GreenButtonHolder.INSTANCE;
    }
    @Override
    void getButton() {
    System.out.println("You have a GreenButton");   
    }
}

RedButton.java

public class RedButton extends Button{
    private static class RedButtonHolder{
        public static RedButton INSTANCE = new RedButton();
    }
    private RedButton(){ }
    public static RedButton getSingleRedButton(){
        return RedButtonHolder.INSTANCE;
    }
    @Override
    void getButton() {
        System.out.println("You have a RedButton"); 
    }
}

2 个答案:

答案 0 :(得分:2)

枚举是单身,所以:

public enum Button {
    RedButton() {
        public void doSomething() {
            // whatever
        }
    },
    GreenButton() {
        public void doSomething() {
            // whatever else
        }
    };
    public void getButton() {
        System.out.println("You have a " + name());
    }
    public abstract void doSomething();
}

枚举也可以包含字段,并且在大多数情况下就像普通类一样。它们的主要限制是它们不能扩展类,但可以实现接口。

答案 1 :(得分:1)

使用enum是实现单例的最简单方法。 JVM将确保实例只有一个没有任何必要的努力。这就是为什么它也更安全。 您的示例可能如下所示:

<强> Button.java

public interface Button {
    void printButton();
}

<强> GreenButton.java

public enum GreenButton implements Button {
    INSTANCE;

    @Override
    public void printButton() {
        System.out.println("Green button");
    }
}

<强> RedButton.java

public enum RedButton implements Button {
    INSTANCE;

    @Override
    public void getButton() {
        System.out.println("Red button");
    }
}

<强> ButtonFactory.java

public ButtonFactory {

    /*
    * In such situation, where you select one from few states (like you do for colors)
    * it's also better to use enum instead of String. It's more convenient to reuse your code. 
    */
    public static Button getButton(ButtonType type) {
        if (type == ButtonType.GREEN)
            return GreenButton.INSTANCE;
        if (type == ButtonType.RED)
            return RedButton.INSTANCE;
    }

    public static enum ButtonType {
        GREEN, RED;
    }
}