準(zhǔn)備些接口和類(lèi)
public interface IMessage {
void send();
}
public class NetMessage implements IMessage {
@Override
public void send() {
System.out.println("由網(wǎng)絡(luò)發(fā)送消息");
}
}
public class QueueMessage implements IMessage {
@Override
public void send() {
System.out.println("由消息隊(duì)列發(fā)送消息");
}
}
public interface ISay {
void say();
}
public class Duck implements ISay {
@Override
public void say() {
System.out.println("鴨子呱呱叫");
}
}
接口直接實(shí)例化
public class JavaDemo {
public static void main(String[] args) throws ClassNotFoundException {
IMessage message = new NetMessage();
message.send();
}
}
弊端:IMessage接口 與 NetMessage子類(lèi)耦合
靜態(tài)工廠類(lèi)
public class Factory {
private static IMessage message = null;
private Factory(){}
public static IMessage getInstance(String className){
if("NetMessage".equals(className)){
message = new NetMessage();
}else if("QueueMessage".equals(className)){
message = new QueueMessage();
}
return message;
}
}
public class JavaDemo {
public static void main(String[] args) throws ClassNotFoundException {
IMessage message = Factory.getInstance("QueueMessage");
message.send();
}
}
弊端:當(dāng)一個(gè)接口每多了一個(gè)子類(lèi)衍慎,就需要在工廠類(lèi)中添加一個(gè)對(duì)應(yīng)的分支,不符合開(kāi)閉原則(對(duì)于擴(kuò)展是開(kāi)放的稳捆,對(duì)于修改是關(guān)閉的)
為一個(gè)接口服務(wù)的工廠類(lèi)(反射)
public class Factory {
private Factory(){}
public static IMessage getInstance(String className) {
IMessage instance = null;
try {
instance = (IMessage) Class.forName(className).newInstance();
} catch(Exception e){
e.printStackTrace();
}
return instance;
}
}
public class JavaDemo {
public static void main(String[] args) throws Exception {
IMessage message = Factory.getInstance("com.sheldon.demo.NetMessage");
message.send();
}
}
考慮:如果項(xiàng)目中有很多接口,是不是需要寫(xiě)很過(guò)工廠類(lèi)或者方法扒呛弧砖织?
為所有接口服務(wù)的工廠類(lèi)(反射 + 泛型)
public class Factory {
private Factory(){}
public static <T> T getInstance(String className,Class<T> cls) {
T instance = null;
try {
instance = (T) Class.forName(className).newInstance();
} catch(Exception e){
e.printStackTrace();
}
return instance;
}
}
public class JavaDemo {
public static void main(String[] args) throws Exception {
IMessage message = Factory.getInstance("com.sheldon.demo.NetMessage",IMessage.class);
message.send();
ISay duck = Factory.getInstance("com.sheldon.demo.Duck",ISay.class);
duck.say();
}
}