我正在学习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");
}
}
答案 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;
}
}