Java設(shè)計(jì)模式——工廠
簡單工廠
簡單工廠模式就是定義一個(gè)接口职恳,寫共性的方法操禀,做具體不同的事揪惦,就像發(fā)QQ,發(fā)微信,都是發(fā)送東西驹饺,但是發(fā)送是不同的軟件
步驟:
1.定義接口蝌借,
2.創(chuàng)建各自子類實(shí)現(xiàn)接口酬荞,重寫方法咧党,坐各自的事;
3.創(chuàng)建工廠類
4.調(diào)用時(shí)候通過調(diào)用方法時(shí)候,傳遞的參數(shù)不同返回不同實(shí)現(xiàn)類的對(duì)象
優(yōu)缺點(diǎn):
不利于擴(kuò)展盼理,擴(kuò)展需要改工程類代碼臊诊,傳遞的參數(shù)找不到匹配會(huì)很尷尬儡首;
代碼:
//創(chuàng)建接口
public interface ISender {
void send();
}
//創(chuàng)建QQ具體類實(shí)現(xiàn)接口
public class SendQQ implements ISender {
@Override
public void send() {
Log.e(TAG, "發(fā)QQ " );
}
}
//創(chuàng)建微信具體類實(shí)現(xiàn)接口
public class SendWeChat implements ISender {
@Override
public void send() {
Log.e(TAG, "發(fā)微信消息" );
}
}
//創(chuàng)建工廠類
public class SendFactory {
// 簡單的工廠
public ISender sendMessage(String s) {
if ("QQ".equals(s)) {
return new SendQQ();
} else if ("WeChat".equals(s)) {
return new SendWeChat();
}
return null;
}
//調(diào)用
SendFactory sendFactory = new SendFactory();
sendFactory.sendMessage("QQ");
多個(gè)工廠
多個(gè)工廠和簡單工廠的區(qū)別就在工廠類不是按調(diào)用方法傳遞來的參數(shù)匹配迈勋,而是寫多個(gè)方法鼻吮,直接返回對(duì)應(yīng)的實(shí)現(xiàn)類對(duì)象
@Override
public class SendFactory {
public ISender sendQQMessage(){
return new SendQQ();
}
public ISender senWeChat(){
return new SendWeChat();
}
}
這樣的缺點(diǎn)依然很明顯禽篱,就是新增加實(shí)現(xiàn)類需要改工廠類的代碼脚仔;
靜態(tài)工廠
靜態(tài)工廠就是上面的方法增加static 修飾吕朵,這樣比起多個(gè)工廠好處就在不用創(chuàng)建對(duì)象猎醇,直接類名調(diào)用
@Override
public class SendFactory {
public static ISender sendQQMessage(){
return new SendQQ();
}
public static ISender senWeChat(){
return new SendWeChat();
}
}
抽象工廠
抽象工廠的實(shí)現(xiàn)就是增加了一個(gè)接口,創(chuàng)建不同的工廠來實(shí)現(xiàn)這個(gè)接口哮塞。這樣的好處就是擴(kuò)展忆畅,不用去改工廠類的代碼。直接增加工廠類實(shí)現(xiàn)這個(gè)接口就好
//工廠接口 你應(yīng)該思考掂之,這個(gè)接口為什么要定義冯乘,因?yàn)樗麄冇泄残载で樱际前l(fā)送東西,具有發(fā)送功能辱士,所以接口定義一個(gè)make方法泪掀,類型是發(fā)送類型就是發(fā)送不同東西共性的類型
public interface IProvider {
ISender make();
}
```java
QQ發(fā)送工廠
public class SendQQFactory implements IProvider {
@Override
public ISender make() {
return new SendQQ();
}
}
微信發(fā)送工廠
public class SendWeChatFactory implements IProvider {
@Override
public ISender make() {
return new SendWeChat();
}
}
//調(diào)用的時(shí)候直接
//抽象工廠的調(diào)用
new SendQQFactory().make();