概念
簡單工廠模式是類的創(chuàng)建模式,又叫靜態(tài)工廠方法(Static Factory Method)模式。簡單工廠模式是由一個(gè)工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例 -摘自《Java與模式》
簡單工廠模式包含三個(gè)角色
- Factory : 工廠角色,是簡單工廠模式下的核心,工廠類會(huì)提供一個(gè)供客戶端調(diào)用Static靜態(tài)方法,根據(jù)客戶端傳遞的參數(shù)的不同,創(chuàng)建不同的實(shí)例對象。
- AbstractProduct : 抽象產(chǎn)品角色,工廠類創(chuàng)建對象的父類,Java語言面向?qū)ο蟮脑O(shè)計(jì)思想,會(huì)盡量將公共的屬性,抽成一個(gè)公共的父類,讓子類進(jìn)行繼承。
- ConcreteeProduct : 具體產(chǎn)品類,由工廠類的靜態(tài)方法創(chuàng)建對象的實(shí)例對象
案例
工廠類
package com.schoki.design.model.factory;
/**
* @author : zhubing.ji
* @description : 工廠類
* @date : 2018/7/5 上午9:53
*/
public class FruitProductFactory {
public static FruitJuiceProduct getInstance(String taste) {
FruitJuiceProduct fruitJuiceProduct;
switch (taste) {
case "apple":
fruitJuiceProduct = new AppliJuiceProduct();
break;
case "orange":
fruitJuiceProduct = new OrangeJuiceProduct();
break;
case "banana":
fruitJuiceProduct = new BananaJuiceProduct();
break;
default:
throw new IllegalArgumentException("參數(shù)異常");
}
return fruitJuiceProduct;
}
}
抽象產(chǎn)品類
、package com.schoki.design.model.factory;
/**
* @author : zhubing.ji
* @description : 抽象產(chǎn)品類
* @date : 2018/7/5 上午9:46
*/
public abstract class FruitJuiceProduct {
private String taste;
public abstract String getTaste();
}
具體產(chǎn)品類
package com.schoki.design.model.factory;
/**
* @author : zhubing.ji
* @description : 具體產(chǎn)品類
* @date : 2018/7/5 上午9:48
*/
public class AppliJuiceProduct extends FruitJuiceProduct{
@Override
public String getTaste() {
return "蘋果味";
}
}
測試
package com.schoki.design.model.factory;
/**
* @author : zhubing.ji
* @description : 測試類
* @date : 2018/7/5 上午9:56
*/
public class FruitMain {
public static void main(String[] args) {
FruitJuiceProduct fruit1 = FruitProductFactory.getInstance("apple");
System.out.println(fruit1.getTaste());
FruitJuiceProduct fruit2 = FruitProductFactory.getInstance("banana");
System.out.println(fruit2.getTaste());
FruitJuiceProduct fruit3 = FruitProductFactory.getInstance("orange");
System.out.println(fruit3.getTaste());
FruitJuiceProduct fruit4 = FruitProductFactory.getInstance("mango");
System.out.println(fruit4.getTaste());
}
}
測試結(jié)果
蘋果味
香蕉味
橘子味
Exception in thread "main" java.lang.IllegalArgumentException: 參數(shù)異常
at com.schoki.design.model.factory.FruitProductFactory.getInstance(FruitProductFactory.java:23)
at com.schoki.design.model.factory.FruitMain.main(FruitMain.java:21)
總結(jié)
總結(jié)
- 對象的創(chuàng)建交給工廠類,業(yè)務(wù)由具體產(chǎn)品類實(shí)現(xiàn),這樣可以實(shí)現(xiàn)對象的創(chuàng)建和業(yè)務(wù)分離,從而降低了系統(tǒng)的耦合度
- 可以根據(jù)需要,調(diào)用工廠的靜態(tài)方法,根據(jù)參數(shù)的不同,創(chuàng)建不同的對象
- 如果有新的產(chǎn)品類,則還需要修改工廠類,這樣違反了開閉原則(對擴(kuò)展開放,對修改關(guān)閉)
- 對于工廠類創(chuàng)建對象相對較少的情況下,可以嘗試使用簡單工廠方法。
- JDK中的java.text.DateFormat,就是使用了簡單工廠模式
public final static DateFormat getDateInstance();
public final static DateFormat getDateInstance(int style);
public final static DateFormat getDateInstance(int style,Locale
寫在最后
1、只有那些瘋狂到認(rèn)為自己可以改變世界的人才能真正的改變世界
2、每一行代碼,每一篇博客,都體現(xiàn)了自己對工作、對技術(shù)、對生活的態(tài)度
參考
http://www.hollischuang.com/archives/1391
http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/simple_factory.html
http://wiki.jikexueyuan.com/project/design-pattern-creation/simple-two.html
http://www.hollischuang.com/archives/1408