在出庫揀貨完成後自然要通過物流將貨物發到最終的2B或2C客戶,這個時候可能有多種方式。比如例子提到的通過自有車隊,第三方車隊,快遞和物流這四種方式將貨物發給最終方。那麼在選擇最終方的時候就可以考慮用工廠模式將進行相關對象的創建
第一種工廠模式 形似而神不似的 簡單工廠模式。
簡單工廠就是我傳遞給你一個變量,你看到後根據指定的變量發給我要用到的對象
在這裏首先將仍然是設計一個頂層的物流接口,然後四種物流形式(自有車隊,第三方車隊,快遞,物流)進行具體的實現
package factory;
/**
- TMS頂層接口
- @author [email protected]
-
*/
public interface ITms {//運輸
public void transport();
}
package factory;
/**
- 公司自有車隊
- @author [email protected]
-
*/
public class Tms implements ITms{@Override
public void transport() {System.out.println("使用自有車隊承運");
}
}
package factory;
/**
- 快遞公司
- @author zhous
-
*/
public class TmsExpress implements ITms{@Override
public void transport() {System.out.println("使用快遞公司承運");
}
package factory;
/**
- 物流公司
- @author zhous
-
*/
public class TmsLogistics implements ITms{@Override
public void transport() {System.out.println("使用物流公司承運");
}
}
package factory;
/**
- 第三方車隊
- @author [email protected]
-
*/
public class TmsThird implements ITms{@Override
public void transport() {System.out.println("使用第三方車隊承運");
}
}
在完成了基本物流形式的抽象與實現後展示簡單工廠的實現實例
最簡單的辦法就是我傳個名稱,你按圖索驥把對象返回給我。再就是根據全限定名返給我一個對象,最後是根據類型來返回我一個對象。
總之是根據參數找到類的對象,然後返給調用方
package factory.factorysimple;
import factory.ITms;
import factory.Tms;
import factory.TmsExpress;
import factory.TmsLogistics;
import factory.TmsThird;
/**
- 簡單工廠模式實現
- @author [email protected]
-
*/
public class SimpleFactory {/**
- 通過變量決定取哪個具體的物流實現
*/
public ITms getTms(String name){
if("tms".equals(name))
return new Tms();
if("third".equals(name))
return new TmsThird();
if("express".equals(name))
return new TmsExpress();
if("logistics".equals(name))
return new TmsLogistics();
else
return null;
}
/** - 以類的全限定名去加載,可以少寫好多廢話
*/
public ITms getTms1(String className){
try {
if( null != className && !"".equals(className)){
return (ITms)Class.forName(className).newInstance();
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
- 傳入Class
*/
public ITms getTms2(Class clazz){
if (null != clazz) {
try {
return (ITms) clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
- 通過變量決定取哪個具體的物流實現
}
實例調用
package factory.factorysimple;
import factory.ITms;
import factory.TmsExpress;
public class SimpleFactoryMain {
public static void main(String[] args) {
SimpleFactory factory = new SimpleFactory();
//自有車隊承運
ITms tms = factory.getTms("tms");
tms.transport();
//第三方車隊承運
ITms tms1 = factory.getTms1("factory.TmsThird");
tms1.transport();
//快遞公司承運
ITms tms2 = factory.getTms2(TmsExpress.class);
tms2.transport();
}
}
調用展示
第二種是一般意義上的工廠模式
這套工廠模式實際上是對工廠進行了抽象。建立了一套工廠接口和實現體系,通過不同的工廠返回不同的對象
首先新建相應的項層接口和各個工廠的實現
package factory.fatorymethod;
import factory.ITms;
/**
- 創建Tms工廠頂層接口
- @author zhous
-
*/
public interface ITmsFactory {public ITms getTms();
}
package factory.fatorymethod;
import factory.ITms;
import factory.Tms;
/**
- 自有車隊工廠
- @author zhous
-
*/
public class TmsFactory implements ITmsFactory {@Override
public ITms getTms() {return new Tms();
}
}
package factory.fatorymethod;
import factory.ITms;
import factory.TmsThird;
/**
- 第三方車隊工廠
- @author zhous
-
*/
public class TmsThirdFactory implements ITmsFactory {@Override
public ITms getTms() {return new TmsThird();
}
}
package factory.fatorymethod;
import factory.ITms;
import factory.TmsExpress;
/**
- 快遞工廠
- @author zhous
-
*/
public class TmsExpressFactory implements ITmsFactory {@Override
public ITms getTms() {return new TmsExpress();
}
}
package factory.fatorymethod;
import factory.ITms;
import factory.TmsLogistics;
/**
- 物流工廠
- @author zhous
-
*/
public class TmsLogicticsFactory implements ITmsFactory {@Override
public ITms getTms() {return new TmsLogistics();
}
}
實例調用
package factory.fatorymethod;
import factory.ITms;
public class MethodFactoryMain {
public static void main(String[] args) {
//調用自營車隊
ITmsFactory factory1 = new TmsFactory();
ITms tms1 = factory1.getTms();
tms1.transport();
//調用自營車隊
ITmsFactory factory2 = new TmsThirdFactory();
ITms tms2 = factory2.getTms();
tms2.transport();
//調用物流
ITmsFactory factory3 = new TmsLogicticsFactory();
ITms tms3 = factory3.getTms();
tms3.transport();
}
}
調用結果展示
第三個是抽象工廠模式,這個適合實際業務中比較複雜的業務邏輯,比如有通用業務變量,通用業務方法等。需要各自單獨實現的部分由具體類擴展。否則按下邊的簡單示例來看,就和普通的工廠方法沒什麼區別了
下邊是簡寫的,大致瞭解有這一種路數就可以了,這裏邊沒有寫頂層的接口,直接從抽象類開始
package factory.factoryabstract;
import factory.ITms;
/**
- declare abstract class
- @author [email protected]
-
*/
public abstract class AbstractTmsFactory {public abstract ITms getTms();
}
具體實現類
package factory.factoryabstract;
import factory.ITms;
import factory.Tms;
/**
- declare tms's extends class
- @author [email protected]
-
*/
public class TmsAbstractFactory extends AbstractTmsFactory{@Override
public ITms getTms() {return new Tms();
}
}
package factory.factoryabstract;
import factory.ITms;
import factory.TmsExpress;
/**
- declare TmsExpress's extends class
- @author [email protected]
-
*/
public class TmsExpressAbstractFactory extends AbstractTmsFactory{@Override
public ITms getTms() {return new TmsExpress();
}
}
實例調用
package factory.factoryabstract;
public class AbstractFactoryMain {
public static void main(String[] args) {
//自有車隊
AbstractTmsFactory factory = new TmsAbstractFactory();
//快遞
AbstractTmsFactory factory1 = new TmsExpressAbstractFactory();
factory.getTms().transport();
factory1.getTms().transport();
}
}
調用效果