設計模式之工廠模式

估計這個系列的文章是每篇一個設計模式,重點是爲了讓你們可以利用休閒時間,好比說5分鐘就可以比較全面通俗易懂地瞭解設計模式。java

前言

接下來就是手撕設計模式的環節了,設計模式自己並不難,難的是在實際狀況下是否能天然地想到使用設計模式。簡單來講設計模式的本質是一種思想,一種重構代碼,使代碼高可用的思想。設計模式

在面向對象設計(寫代碼)的時候通常會遵循如下幾個原則,固然初學確定很難遵循,可是至少得了解是什麼,而後有意識地往這個方向靠。ide

  • 單一職責原則: 一個類只負責具體的某一個功能,當新需求出現的時候,最好的作法是增長一個類而不是修改原來的類。
  • 開閉原則: 當開發好一個類後,這個類須要有良好的擴展性,能夠經過繼承和多態來添加新功能。
  • 里氏替換原則: 把父類換成子類,程序不會報錯,可是反過來就不行。通俗地來說,子類可以擴展父類的功能,可是不能改變原來父類原有的功能。
  • 接口隔離原則: 客戶端不該該依賴於它所不須要的接口,設計接口時儘可能精簡單一。
  • 依賴倒置原則: 高級模塊不該該依賴低級模塊,二者都給應該依賴抽象;抽象不該該依賴細節,細節應該依賴抽象。

這些理論的東西我已經儘量簡單地講了測試

簡單點

工廠及抽象工廠模式


有關工廠模式有三種,簡單工廠,工廠,抽象工廠,一般來講,前面二者併爲一項說工廠模式。spa

那麼什麼叫工廠模式呢,最簡單來講,你不必和產品打交道,你直接和工廠打交道,把new 產品的操做交給工廠來作。設計

一、簡單工廠模式


之因此簡單,是由於它只涉及到具體工廠類,抽象產品類和具體產品類,下面直接來看代碼。code

抽象產品類:

手機對象

public abstract class AbstractPhone {
    public abstract void use();
}

具體產品類:

魅族手機和一加手機繼承

public class Meizu extends AbstractPhone{
    @Override
    public void use() {
        System.out.println("正在使用魅族手機");
    }
}
public class OnePlus extends AbstractPhone {
    @Override
    public void use() {
        System.out.println("正在使用一加手機");
    }
}

具體工廠類:

生產手機的工廠接口

public class PhoneFactory {
    public AbstractPhone createPhone(String brand) {
        if(brand.equals("一加")) {
            return new OnePlus();
        } else if(brand.equals("魅族")) {
            return new Meizu();
        } else {
            System.out.println("沒有該品牌的生產權");
            return null;
        }
    }
}

測試類:

@Test
public void test01() {
    //新建一個工廠
    PhoneFactory factory = new PhoneFactory();            
    
    //咱們沒必要要跟產品打交道,告訴工廠須要一部一加手機便可
    AbstractPhone onePlus = factory.createPhone("一加");    
    onePlus.use();

    AbstractPhone meiZu = factory.createPhone("魅族");
    meiZu.use();
}

以上就是簡單工廠的實現方式,總結就是

  1. 有個抽象產品類或者接口
  2. 具體產品繼承或者實現抽象產品
  3. 具體工廠類,根據需求生產產品

UML類圖:

普通工廠UML

二、工廠模式


如今問題來了,若是這個工廠繼續和小米,華爲合做的話

須要加錢

開玩笑開玩笑,除了具體產品類須要增長,是否是也須要修改具體工廠類,這是咱們不但願看到的。設計好的類,最好就是不要是在增長需求的時候改變類。

因此想到了把生產工廠抽象化,須要增長小米,只須要添加一個小米的生產類,而不改動已有的工廠類。這樣就是工廠模式。

須要抽象產品類,具體產品類,抽象工廠類,具體工廠類

抽象產品類:

和上面用的是同樣的抽象產品,這裏再也不贅述

具體產品:

一樣是魅族和一加手機

抽象工廠類:

public abstract class AbstractPhoneFactory {
    public abstract AbstractPhone createPhone();
}

具體工廠類:

這個例子中有兩個具體工廠類,生產魅族手機的工廠和一加手機的工廠

public class OnePlusFactory extends AbstractPhoneFactory {
    @Override
    public OnePlus createPhone() {
        return new OnePlus();
    }
}
public class MeizuFactory extends AbstractPhoneFactory {
    @Override
    public Meizu createPhone() {
        return new Meizu();
    }
}

測試類:

@Test
public void test02() {
    OnePlusFactory onePlusFactory = new OnePlusFactory();
    onePlusFactory.createPhone().use();

    MeizuFactory meizuFactory = new MeizuFactory();
    meizuFactory.createPhone().use();

}

就算以後須要增長一個小米手機類,只須要添加具體產品類,具體工廠類,並不須要修改已有的類。

類圖:

三、抽象工廠模式


若是如今需求繼續增長,可是不是增長品牌種類,而是。魅族和一加但願更準確地找到市場定位,因此都推出了中端手機和高端旗艦手機來衝擊市場,這時候咱們應該怎樣設計呢。

這時候抽象工廠類不是單純地生產手機,而是須要生產一個產品族

產品族是以產品平臺爲基礎,經過添加不一樣的個性模塊,以知足不一樣客戶個性化需求的一組相關產品。

中端手機和旗艦手機就是一個產品族。

總的來講,通俗地來說就是魅族工廠須要生產魅族的中端手機和魅族的高端手機,一加工廠須要生產一加的中端手機和高端手機。

須要抽象工廠類,具體的抽象工廠類,抽象產品類,產品族具體的抽象產品類,具體產品類

抽象產品類:

public abstract class AbstractPhone {
    public abstract void use();
}

產品族具體的抽象產品類:

中端手機和旗艦手機

public abstract class AbstractMiddlePhone extends AbstractPhone {
    @Override
    public abstract void use();
}
public abstract class AbstractTopPhone extends AbstractPhone{
    public abstract void use();
}

具體產品類:

魅族的中端手機,旗艦手機;一加的中端手機,旗艦手機。

public class MeizuMiddlePhone extends AbstractMiddlePhone {
    @Override
    public void use() {
        System.out.println("魅族中端產品");
    }
}
public class MeizuTopPhone extends AbstractTopPhone {
    @Override
    public void use() {
        System.out.println("魅族高端旗艦");
    }
}
public  class OnePlusMiddlePhone extends AbstractMiddlePhone {
    @Override
    public void use() {
        System.out.println("一加中端產品");
    }
}
public class OnePlusTopPhone extends AbstractTopPhone {
    @Override
    public void use() {
        System.out.println("一加高端旗艦");
    }
}

抽象工廠類:

public abstract class AbstractFactory {
    public abstract AbstractPhone createMiddlePhone();

    public abstract AbstractPhone createTopPhone();
}

具體抽象工廠類:

魅族生產工廠,一加生產工廠

public class MeizuFactory extends AbstractFactory {
    @Override
    public MeizuMiddlePhone createMiddlePhone() {
        return new MeizuMiddlePhone();
    }

    @Override
    public MeizuTopPhone createTopPhone() {
        return new MeizuTopPhone();
    }
}
public class OnePlusFactory extends AbstractFactory {
    @Override
    public OnePlusMiddlePhone createMiddlePhone() {
        return new OnePlusMiddlePhone();
    }

    @Override
    public OnePlusTopPhone createTopPhone() {
        return new OnePlusTopPhone();
    }
}

測試類:

@Test
public void test03() {
    OnePlusFactory onePlusFactory = new OnePlusFactory();
    MeizuFactory meizuFactory = new MeizuFactory();
    onePlusFactory.createMiddlePhone().use();
    onePlusFactory.createTopPhone().use();

    meizuFactory.createMiddlePhone().use();
    meizuFactory.createTopPhone().use();

}

類圖:

相關文章
相關標籤/搜索