一、工廠模式

場景:以牛奶為例,有蒙牛、伊利、愛慕希等品牌。

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());
    }
}

優點

  • 程式碼結構簡單。
  • 獲取產品的過程更加簡單。
  • 滿足了開閉原則,即對拓展開放,對修改關閉。

缺點

  • 拓展較繁瑣,要拓展時,需同時改動抽象工廠和工廠實現類。