在簡(jiǎn)單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實(shí)例冈在。簡(jiǎn)單工廠模式專門定義一個(gè)類來(lái)負(fù)責(zé)創(chuàng)建其他類的實(shí)例械荷,被創(chuàng)建的實(shí)例通常都具有共同的父類。
包括三個(gè)角色:
-Factory:工廠角色
-Product:抽象產(chǎn)品角色
-ConcreteProduct:具體產(chǎn)品角色
UML類圖:
抽象產(chǎn)品角色
public abstract class Product {
//所有產(chǎn)品類的公共業(yè)務(wù)方法
public void methodSame() {
//公共方法的實(shí)現(xiàn)
}
//聲明抽象業(yè)務(wù)方法
public abstract void methodDiff();
}
具體產(chǎn)品
//具體產(chǎn)品A
public class ConcreteProductA extends Product {
// 產(chǎn)品A實(shí)現(xiàn)方法
@Override
public void methodDiff() {
}
}
//具體產(chǎn)品B
public class ConcreteProductB extends Product {
//產(chǎn)品B實(shí)現(xiàn)方法
@Override
public void methodDiff() {
}
}
工廠角色
//工廠角色
public class Factory {
public static Product getProduct(String productType){
Product product = null;
if (productType.equalsIgnoreCase("A")) {
product = new ConcreteProductA();
//初始化設(shè)置product
}
else if (productType.equalsIgnoreCase("B")) {
product = new ConcreteProductB();
//初始化設(shè)置product
}
return product;
}
}
客戶端
//客戶端簡(jiǎn)單工廠使用
public class Client {
public static void main(String[] args) {
Product product = Factory.getProduct("A");
product.methodSame();
product.methodDiff();
}
}
簡(jiǎn)單工廠模式的優(yōu)點(diǎn)
1.實(shí)現(xiàn)了對(duì)責(zé)任的分割漓摩,提供了專門的工廠類用于創(chuàng)建對(duì)象。
2.客戶端無(wú)須知道所創(chuàng)建的具體產(chǎn)品類的類名入客,只需要知道具體產(chǎn)品類所對(duì)應(yīng)的參數(shù)即可管毙。
3.可以在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類。
簡(jiǎn)單工廠模式的缺點(diǎn)
1.工廠類集中了所有產(chǎn)品創(chuàng)建邏輯桌硫,一旦不能正常工作夭咬,整個(gè)系統(tǒng)都要受到影響。
2.增加系統(tǒng)中類的個(gè)數(shù)铆隘。增加了系統(tǒng)的復(fù)雜度和理解難度卓舵。
3.系統(tǒng)擴(kuò)展困難,一旦添加新產(chǎn)品就不得不修改工廠邏輯膀钠。
4.由于使用了靜態(tài)工廠方法掏湾,造成工廠角色無(wú)法形成基于繼承的等級(jí)結(jié)構(gòu)。
適應(yīng)環(huán)境
1.客戶端只知道傳入工廠類的參數(shù)肿嘲,對(duì)于如何創(chuàng)建對(duì)象不關(guān)心融击。
2.工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少。
參考:
https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/simple_factory.html#id23