工廠模式

簡(jiǎn)單工廠模式(補(bǔ)充)

也稱為靜態(tài)工廠方法模式,由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例。

簡(jiǎn)單工廠模式中有如下角色:

  • 工廠類:核心,負(fù)責(zé)創(chuàng)建所有實(shí)例的內(nèi)部邏輯,由外界直接調(diào)用。
  • 抽象產(chǎn)品類:要?jiǎng)?chuàng)建所有對(duì)象的抽象父類,負(fù)責(zé)描述所有實(shí)例所共有的公共接口。
  • 具體產(chǎn)品類:要?jiǎng)?chuàng)建的產(chǎn)品。
簡(jiǎn)單示例

1、抽象產(chǎn)品類

public abstract class MobilePhone {
    public abstract String brand();
}

2、具體產(chǎn)品類

public class XiaoMiMobilePhone extends MobilePhone {
    @Override
    public String brand() {
        return "xiaomi";
    }
}

public class HuaWeiMobilePhone extends MobilePhone {
    @Override
    public String brand() {
        return "huawei";
    }
}


public class VivoMobilePhone extends MobilePhone {
    @Override
    public String brand() {
        return "vivo";
    }
}

3、工廠類

public class MobilePhoneFactory {
    public static MobilePhone createMobilePhone(String type) {
        MobilePhone mobilePhone = null;
        switch (type) {
            case "xiaomi":
                mobilePhone = new XiaoMiMobilePhone();
                break;
            case "huawei":
                mobilePhone = new HuaWeiMobilePhone();
                break;
            case "vivo":
                mobilePhone = new VivoMobilePhone();
                break;
        }
        return mobilePhone;
    }
}

測(cè)試

  @Test
    public void testSimpleFactory() {
        System.out.println("xiaomi:"+ MobilePhoneFactory.createMobilePhone("xiaomi").brand());
        System.out.println("huawei:"+ MobilePhoneFactory.createMobilePhone("huawei").brand());
        System.out.println("vivo:"+ MobilePhoneFactory.createMobilePhone("vivo").brand());
    }

測(cè)試結(jié)果

xiaomi:xiaomi
huawei:huawei
vivo:vivo

它需要知道所有工廠類型,因此只適合工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少的情況。
避免直接實(shí)例化類,降低耦合性。
增加新產(chǎn)品需要修改工廠,違背開放封閉原則。

工廠方法模式

定義一個(gè)用于創(chuàng)建對(duì)象的接口,使類的實(shí)例化延遲到子類。

工廠方法有以下角色:

  • 抽象產(chǎn)品類。
  • 具體產(chǎn)品類。
  • 抽象工廠類:返回一個(gè)泛型的產(chǎn)品對(duì)象。
  • 具體工廠類:返回具體的產(chǎn)品對(duì)象。
簡(jiǎn)單示例

抽象產(chǎn)品類和具體產(chǎn)品類同簡(jiǎn)單工廠一樣。

1、抽象工廠類

public abstract class AbstractMobilePhoneFactory {
    public abstract  <T extends MobilePhone> T createMobilePhone(Class<T> clz);
}

4、具體工廠類

public class MobilePhoneFactoryImpl extends AbstractMobilePhoneFactory {
    @Override
    public   <T extends MobilePhone> T createMobilePhone(Class<T> clz) {
        MobilePhone mobilePhone = null;
        String classname = clz.getName();
        try {
            mobilePhone = (MobilePhone) Class.forName(classname).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) mobilePhone;
    }
}

獲取工廠實(shí)例單例

//第一次調(diào)用getInstance方法時(shí)虛擬機(jī)才加載SingletonHolder并初始化sInstance,這樣保證了線程安全和實(shí)例的唯一性。
public class MobilePhoneFactoryImplSingleton {
    private MobilePhoneFactoryImplSingleton() {
    }
    public static MobilePhoneFactoryImpl getInstance() {
        return SingletonHolder.sInstance;
    }
    private static class SingletonHolder {
        private static final MobilePhoneFactoryImpl sInstance = new MobilePhoneFactoryImpl();
    }
}
@Test
public void testAbstractFactory() {
        System.out.println("instance1:"+ MobilePhoneFactoryImplSingleton.getInstance());
        System.out.println("instance2:"+ MobilePhoneFactoryImplSingleton.getInstance());
        System.out.println("vivo:"+ MobilePhoneFactoryImplSingleton.getInstance().createMobilePhone(VivoMobilePhone.class).brand());
        System.out.println("huawei:"+MobilePhoneFactoryImplSingleton.getInstance().createMobilePhone(HuaWeiMobilePhone.class).brand());
        System.out.println("xiaomi:"+ MobilePhoneFactoryImplSingleton.getInstance().createMobilePhone(XiaoMiMobilePhone.class).brand());
    }

測(cè)試結(jié)果

instance1:sysshare.lq.com.demosapplication.designPattern.factory.abstractFactory.MobilePhoneFactoryImpl@2957fcb0
instance2:sysshare.lq.com.demosapplication.designPattern.factory.abstractFactory.MobilePhoneFactoryImpl@2957fcb0
vivo:vivo
huawei:huawei
xiaomi:xiaomi
  • 相比簡(jiǎn)單工廠,如果我們需要新增產(chǎn)品類,無(wú)需修改工廠類,直接創(chuàng)建產(chǎn)品即可。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 工廠模式是我們最常用的實(shí)例化對(duì)象模式了,是用工廠方法代替new操作的一種模式。通常我們所說(shuō)的工廠模式是指工廠方法模...
    zfylin閱讀 1,409評(píng)論 0 7
  • 昨天,一場(chǎng)春雨飄落京城。 1 早上,推門而出,吸入第一口空氣,沒(méi)有往日的干燥硬冷,濕潤(rùn)感透過(guò)鼻腔,一點(diǎn)點(diǎn)穿過(guò)氣管,...
    flyinrain12123閱讀 519評(píng)論 2 6
  • 東方還未吐白,我已經(jīng)蘇醒了,比尼采自詡的偉大的太陽(yáng)還要早一點(diǎn)。窗外還是灰蒙蒙的一片,如陰陽(yáng)交替的逢魔時(shí)刻。剛從夢(mèng)境...
    年樺樺閱讀 169評(píng)論 0 1

友情鏈接更多精彩內(nèi)容