Spring中的設計模式(一):工廠模式
阿新 • • 發佈:2019-02-18
一、工廠模式
場景:以牛奶為例,有蒙牛、伊利、愛慕希等品牌。
public interface Milk {
/**
* 獲得一種牛奶產品
* @return
*/
String getName();
}
產品實現介面:
public class Menniu implements Milk{
@Override
public String getName() {
return "蒙牛";
}
}
public class Aimuxi implements Milk{ @Override public String getName() { return "愛慕希"; } }
public class Yili implements Milk{
@Override
public String getName() {
return "伊利";
}
}
1、簡單工廠
又叫做靜態工廠方法(StaticFactory Method)模式,它的實質是有一個工廠類根據傳入的引數,動態的決定應該建立哪一個產品類。
/** * 簡單工廠(小作坊式) * Created by zwz on 2018/8/20. */ public class SimpleFactory { public Milk getMilk(String name){ if("愛慕希".equals(name)){ return new Aimuxi(); }else if("蒙牛".equals(name)){ return new Menniu(); }else if("伊利".equals(name)){ return new Yili(); }else{ System.out.println("不能生產你所需的產品"); return null; } } }
測試類:
public class Test {
public static void main(String[] args) {
SimpleFactory factory = new SimpleFactory();
Milk milk = factory.getMilk("愛慕希");
System.out.println(milk);
}
}
特點:
從一個方法中獲取多中物件。
缺點:
拓展性差,需要建立新的物件時,需要去修改工廠類方法,還需維護標識。
2、工廠方法
工廠方法提供一個工廠介面,讓其實現類決定例項化那種產品,並建立對應的類,
首先創個工廠模型:
/**
* 工廠模型
* Created by zwz on 2018/8/20.
*/
public interface Factory {
Milk getMilk();
}
多個工廠實現介面,每個工廠生產不同的產品:
public class AimuxiFactory implements Factory{
@Override
public Milk getMilk() {
return new Aimuxi();
}
}
public class MenniuFactory implements Factory{
@Override
public Milk getMilk() {
return new Menniu();
}
}
public class YiliFactory implements Factory {
@Override
public Milk getMilk() {
return new Yili();
}
}
測試類:
public class FactoryTest {
public static void main(String[] args) {
Factory factory = new MenniuFactory();
System.out.println(factory.getMilk());
}
}
優點:
- 一定程度上解耦,消費者不需關心產品實現類如何改變。
- 一定程度上增加拓展性,若想要拓展產品,只需增加產品實現。
- 一定程度上增加了程式碼的封裝性,可讀性。
缺點:
- 新增一個產品就需增加一個實現類,會造成程式碼氾濫。
- 工廠的建立對使用者而言較麻煩。
3、抽象工廠
抽象工廠,是spring中用的最為廣泛的一種設計模式
首先建立一個抽象工廠類:
/**
* 抽象工廠
* spring中用的最為廣泛的一種設計模式
* 為什麼不使用介面:抽象類可以儲存一些公共的邏輯,方便統一管理,易於拓展
* Created by zwz on 2018/8/20.
*/
public abstract class AbstractFactory {
//這些是公共的邏輯,便於管理
abstract Milk getMenniu();
abstract Milk getYili();
abstract Milk getAimuxi();
}
實現類:
public class MilkFactory extends AbstractFactory{
@Override
Milk getMenniu() {
return new MenniuFactory().getMilk();
}
@Override
Milk getYili() {
return new YiliFactory().getMilk();
}
@Override
Milk getAimuxi() {
return new AimuxiFactory().getMilk();
}
}
測試類:
public class AbstractFactoryTest {
public static void main(String[] args) {
MilkFactory factory = new MilkFactory();
//對使用者而言,獲取產品更加簡單
System.out.println(factory.getYili());
}
}
優點:
- 程式碼結構簡單。
- 獲取產品的過程更加簡單。
- 滿足了開閉原則,即對拓展開放,對修改關閉。
缺點:
- 拓展較繁瑣,要拓展時,需同時改動抽象工廠和工廠實現類。