估計這個系列的文章是每篇一個設計模式,重點是爲了讓你們可以利用休閒時間,好比說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(); }
以上就是簡單工廠的實現方式,總結就是
如今問題來了,若是這個工廠繼續和小米,華爲合做的話
開玩笑開玩笑,除了具體產品類須要增長,是否是也須要修改具體工廠類,這是咱們不但願看到的。設計好的類,最好就是不要是在增長需求的時候改變類。
因此想到了把生產工廠抽象化,須要增長小米,只須要添加一個小米的生產類,而不改動已有的工廠類。這樣就是工廠模式。
須要抽象產品類,具體產品類,抽象工廠類,具體工廠類
和上面用的是同樣的抽象產品,這裏再也不贅述
一樣是魅族和一加手機
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(); }