工廠模式學習
工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬於 創建型模式 ,它提供了一種創建對象的最佳方式。
在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,並且是通過使用一個共同的接口來指向新創建的對象。
簡單工廠模式
抽象一個麪條基類,麪條有蘭州拉麪、泡麪等種類
public abstract class Noodles {
/**
* 描述每種麪條
*/
public abstract void desc();
}
蘭州拉麪
public class LzNoodles extends Noodles {
@Override
public void desc() {
System.out.println("蘭州拉麪");
}
}
泡麪
public class PaoNoodles extends Noodles {
@Override
public void desc() {
System.out.println("泡麪");
}
}
麪條工廠
public class SimpleNoodlesFactory {
public static final int TYPE_LZ = 1;//蘭州拉麪
public static final int TYPE_PM = 2;//泡麪
public static Noodles createNoodles(int type) {
switch (type) {
case TYPE_LZ:
return new LzNoodles();
case TYPE_PM:
default:
return new PaoNoodles();
}
}
}
create()方法通常是靜態的,所以也稱之爲靜態工廠
簡單工廠模式每添加一個產品子類,都必須在工廠類中添加一個判斷分支,這違背了開放-封閉原則
工廠方法模式
工廠方法模式就是把簡單工廠中具體的工廠類,劃分成兩層:抽象工廠層+具體的工廠子類層。(一般->特殊)
麪條工廠(抽象工廠類),作用就是生產麪條:
//抽象麪條工廠
public abstract class NoodlesFactory {
public abstract INoodles create();
}
蘭州拉麪工廠 (具體工廠子類):
public class LzFactory extends NoodlesFactory {
@Override
public INoodles create() {
return new LzNoodles();
}
}
泡麪工廠 (具體工廠子類):
public class PaoFactory extends NoodlesFactory {
@Override
public INoodles create() {
return new PaoNoodles();
}
}
具體使用
NoodlesFactory factory1 = new LzFactory();
Noodles LzNoodles = factory1.create();
gk3.desc();
可以看出,工廠方法模式特點:不僅僅做出來的產品要抽象, 工廠也應該需要抽象。
工廠方法使一個產品類的實例化延遲到其具體工廠子類.
工廠方法的好處就是更擁抱變化。當需求變化,只需要增刪相應的類,不需要修改已有的類。
缺點:
引入工廠方法模式後,每次新增一個具體產品類,也要同時新增一個具體工廠類
抽象工廠模式
以上介紹的工廠都是單產品系的。抽象工廠是多產品系
這裏一個工廠不僅生產麪條,同時它也生產飲料
飲料類
public abstract class Drinks {
/**
* 描述每種飲料多少錢
*/
public abstract void prices();
}
可樂:
public class ColaDrinks extends Drinks {
@Override
public void prices() {
System.out.println("可樂3塊");
}
}
果汁:
public class JuiceDrinks extends Drinks {
@Override
public void prices() {
System.out.println("果汁4塊");
}
}
抽象工廠類
public abstract class AbstractFoodFactory {
/**
* 生產麪條
*/
public abstract Noodles createNoodles();
/**
* 生產飲料
*/
public abstract Drinks createDrinks();
}
統一工廠(具體工廠類):
public class TYlmFoodFactory extends AbstractFoodFactory {
@Override
public Noodles createNoodles() {
return new LzNoodles();//蘭州拉麪
}
@Override
public Drinks createDrinks() {
return new JuiceDrinks();//賣果汁
}
}
康師傅工廠(具體工廠類):
public class KSFFoodFactory extends AbstractFoodFactory {
@Override
public Noodles createNoodles() {
return new PaoNoodles();//泡麪
}
@Override
public Drinks createDrinks() {
return new ColaDrinks();//賣可樂
}
}
使用
AbstractFoodFactory abstractFoodFactory1 = new TYFoodFactory();
abstractFoodFactory1.createDrinks().prices();
abstractFoodFactory1.createNoodles().desc();
abstractFoodFactory1= new KSFFoodFactory();
abstractFoodFactory1.createDrinks().prices();
abstractFoodFactory1.createNoodles().desc();
輸出
果汁4塊
蘭州拉麪
可樂3塊
泡麪
總結
工廠模式:方便創建 同種產品類型的 複雜參數 對象
工廠模式重點就是適用於 構建同產品類型(同一個接口 基類)的不同對象時,這些對象new很複雜,需要很多的參數,而這些參數中大部分都是固定的,所以便用工廠模式封裝。
(如果構建某個對象很複雜,需要很多參數,但這些參數大部分都是“不固定”的,應該使用Builder模式)