由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類(lèi)的實(shí)例,屬于創(chuàng)建型模式。
定義發(fā)送接口
public interface Sender {
public void Send();
}
以及實(shí)現(xiàn)的兩個(gè)發(fā)送短信 和發(fā)送郵件
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mail sender!");
}
}
發(fā)送短信
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("this is sms sender!");
}
}
建造工廠, 一般寫(xiě)法:
public class NormalFactory {
public Sender produce(String type) {
if ("mail".equals(type)) {
return new MailSender();
} else if ("sms".equals(type)) {
return new SmsSender();
} else {
System.out.println("請(qǐng)輸入正確的類(lèi)型!");
return null;
}
}
}
在測(cè)試入口測(cè)試
public class FactoryTest {
public static void main(String[] args) {
normalFactory();
// multiFactory();
// staticFactory();
}
// 一般寫(xiě)法
private static void normalFactory() {
NormalFactory factory = new NormalFactory();
Sender sender = factory.produce("sms");
sender.Send();
}
// 多個(gè)工廠方法模式
private static void multiFactory() {
MultiFactory factory = new MultiFactory();
Sender sender = factory.produceMail();
sender.Send();
}
// 靜態(tài) 工廠
private static void staticFactory() {
Sender sender = StaticFactory.produceMail();
sender.Send();
}
}
當(dāng)然,產(chǎn)品多了這樣寫(xiě)沒(méi)效率,使用 多個(gè)工廠方法模式
public class MultiFactory {
public Sender produceMail() {
return new MailSender();
}
public Sender produceSms() {
return new SmsSender();
}
}
或者 使用 靜態(tài)方式
public class StaticFactory {
public static Sender produceMail() {
return new MailSender();
}
public static Sender produceSms() {
return new SmsSender();
}
}
調(diào)用方法在測(cè)試類(lèi),使用場(chǎng)景的理解:
比如不同模塊對(duì)網(wǎng)絡(luò)請(qǐng)求,可以把 使用靜態(tài)方式創(chuàng)造不同模塊的 網(wǎng)絡(luò)請(qǐng)求實(shí)現(xiàn) 。工廠類(lèi)始終返回的是這個(gè)抽象類(lèi),這樣如果對(duì)原有功能進(jìn)行更改或是新添加新的功能,也不會(huì)對(duì)原來(lái)的其他類(lèi)做修改。