對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)嚎研,設(shè)計(jì)模式有時(shí)候就是一道坎蓖墅,但是設(shè)計(jì)模式又非常有用库倘,過(guò)了這道坎,它可以讓你水平提高一個(gè)檔次论矾。而在android開(kāi)發(fā)中教翩,必要的了解一些設(shè)計(jì)模式又是必須的,因?yàn)樵O(shè)計(jì)模式在Android源碼中贪壳,可以說(shuō)是無(wú)處不在饱亿。對(duì)于想系統(tǒng)的學(xué)習(xí)設(shè)計(jì)模式的同學(xué),這里推薦一本書(shū)闰靴,《大話設(shè)計(jì)模式》彪笼。
Android常用設(shè)計(jì)模式系列:
單例模式
模板模式
適配器模式
工廠模式
代理模式
原型模式
策略模式
Build模式
觀察者模式
裝飾者模式
模板方法模式
工廠模式是非常常見(jiàn)的設(shè)計(jì)模式之一,寫(xiě)個(gè)筆記蚂且,記錄一下我的學(xué)習(xí)過(guò)程和心得配猫。
首先了解一些工廠模式的定義。
定義一個(gè)用于創(chuàng)建對(duì)象的接口杏死,讓子類(lèi)決定實(shí)例化哪個(gè)類(lèi)泵肄。
由定義可以知道,涉及的角色有:
- Product(抽象產(chǎn)品類(lèi)):要?jiǎng)?chuàng)建的復(fù)雜對(duì)象识埋,定義對(duì)象的公共接口凡伊。
- ConcreteProduct(具體產(chǎn)品類(lèi)):實(shí)現(xiàn)Product接口。
- Factory(抽象工廠類(lèi)):該方法返回一個(gè)Product類(lèi)型的對(duì)象窒舟。
- ConcreteFactory(具體工廠類(lèi)):返回ConcreteProduct實(shí)例系忙。
工廠方法模式屬于創(chuàng)建型模式。
工廠方法模式主要用來(lái)創(chuàng)建復(fù)雜的對(duì)象惠豺,簡(jiǎn)單對(duì)象能夠使用new來(lái)創(chuàng)建就不用工廠方法模式來(lái)創(chuàng)建了银还。
下面舉個(gè)例子,說(shuō)一下實(shí)現(xiàn)
1 創(chuàng)建抽象產(chǎn)品類(lèi)洁墙,定義公共接口:
//抽象產(chǎn)品類(lèi)
public abstract class Product {
public abstract void show();
}
2. 創(chuàng)建具體產(chǎn)品類(lèi)蛹疯,繼承Product類(lèi):
//具體產(chǎn)品類(lèi)A
public class ProductA extends Product {
@Override
public void show() {
System.out.println("product A");
}
}
//具體產(chǎn)品類(lèi)B
public class ProductB extends Product {
@Override
public void show() {
System.out.println("product B");
}
}
3 創(chuàng)建抽象工廠類(lèi),定義公共接口:
//抽象工廠類(lèi)
public abstract class Factory {
public abstract Product create();
}
4 創(chuàng)建具體工廠類(lèi)热监,繼承抽象工廠類(lèi)捺弦,實(shí)現(xiàn)創(chuàng)建具體的產(chǎn)品:
//具體工廠類(lèi)A
public class FactoryA extends Factory {
@Override
public Product create() {
return new ProductA();//創(chuàng)建ProductA
}
}
//具體工廠類(lèi)B
public class FactoryB extends Factory {
@Override
public Product create() {
return new ProductB();//創(chuàng)建ProductB
}
}
5 測(cè)試方法:
public void test() {
//產(chǎn)品A
Factory factoryA = new FactoryA();
Product productA = factoryA.create();
productA.show();
//產(chǎn)品B
Factory factoryB = new FactoryB();
Product productB = factoryB.create();
productB.show();
}
廣泛應(yīng)用
總結(jié)
總結(jié)一下工廠模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
符合開(kāi)放封閉原則,新增產(chǎn)品時(shí)孝扛,只需增加相應(yīng)的具體產(chǎn)品類(lèi)和相應(yīng)的工廠子類(lèi)即可列吼。
符合單一職責(zé)原則,每個(gè)具體工廠類(lèi)只負(fù)責(zé)創(chuàng)建對(duì)應(yīng)的產(chǎn)品苦始。
缺點(diǎn)
一個(gè)具體工廠只能創(chuàng)建一種具體產(chǎn)品寞钥。
增加新產(chǎn)品時(shí),還需增加相應(yīng)的工廠類(lèi)陌选,系統(tǒng)類(lèi)的個(gè)數(shù)將成對(duì)增加理郑,增加了系統(tǒng)的復(fù)雜度和性能開(kāi)銷(xiāo)蹄溉。
引入的抽象類(lèi)也會(huì)導(dǎo)致類(lèi)結(jié)構(gòu)的復(fù)雜化。