android 工厂模式创建,7、Android设计模式---(创建型设计模式)抽象工厂模式
一、介紹,定義
抽象工廠模式也是創(chuàng)建型模式之一,抽象工廠模式起源于對不同操作系統(tǒng)的圖形化解決方案,如不同操作系統(tǒng)的按鈕和文本框控件及其實(shí)現(xiàn)。
為創(chuàng)建一組相關(guān)或者相互依賴的對象提供接口,而不需要具體指定他們的具體類。
二、使用場景
一個對象族有相同的約束時可以使用抽象工廠模式。(比如Android、IOS、Windows Phone下都有短信和撥號軟件)
三、UML類圖
8.png
AbstractFactory:抽象工廠角色,聲明了一組用于創(chuàng)建一種產(chǎn)品的方法,每個方法對應(yīng)生產(chǎn)一種產(chǎn)品,上面生成產(chǎn)品A和B。
ConcreteFactory:具體工廠角色,實(shí)現(xiàn)了抽象工廠中定義的創(chuàng)建產(chǎn)品的方法,生成一組具體的產(chǎn)品,每一個產(chǎn)品又位于某個產(chǎn)品等級中。
AbstractProduct:抽象產(chǎn)品角色,定義了每種產(chǎn)品應(yīng)有的方法
ConcreteProduct:具體的產(chǎn)品角色,定義了具體工廠生產(chǎn)的具體產(chǎn)品對象,實(shí)現(xiàn)抽象產(chǎn)品中聲明的方法。
四、通用模式代碼
抽象的產(chǎn)品A和B
public abstract class AbstractProductA {
public abstract void method();
}
public abstract class AbstractProductB {
public abstract void method();
}
具體的產(chǎn)品A1,A2,B1,B2
public class ConcreteProductA1 extends AbstractProductA {
@Override
public void method() {
System.out.println("產(chǎn)品A1的方法");
}
}
public class ConcreteProductA2 extends AbstractProductA {
@Override
public void method() {
System.out.println("產(chǎn)品A2的方法");
}
}
public class ConcreteProductB1 extends AbstractProductB {
@Override
public void method() {
System.out.println("產(chǎn)品B1的方法");
}
}
public class ConcreteProductB2 extends AbstractProductB {
@Override
public void method() {
System.out.println("產(chǎn)品B2的方法");
}
}
抽象工廠:
public abstract class AbstractFactory {
public abstract AbstractProductA createProductA();
public abstract AbstractProductB createProductB();
}
具體的工廠1和2
public class ConcreteFactory1 extends AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}
public class ConcreteFactory2 extends AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB2();
}
}
五、簡單實(shí)現(xiàn)
上一篇講到,小民開了個Audi車組裝工廠。隨著小民生意越做越大,發(fā)現(xiàn)Q3,Q5,Q7使用的零件各不相同,他們的零件又有差別,Q3的發(fā)動機(jī)是國產(chǎn)的,輪胎是鐵的。Q7的發(fā)動機(jī)是外國的,輪胎是塑料的。不同的輪胎,不同的發(fā)動機(jī),都也是一種產(chǎn)品類型,這時候就能用抽象產(chǎn)品模式:
首先 汽車工廠需要生產(chǎn)輪胎、發(fā)動機(jī)、制動系統(tǒng)這三種部件:
public abstract class CarFactory {
//輪胎
public abstract ITire createTire();
//發(fā)動機(jī)
public abstract IEngine createEngine();
//制動系統(tǒng)
public abstract IBrake createBrake(); //返回 制動系統(tǒng) 對象
}
這里我們?yōu)槊恳粋€零件定義一個接口,并分別創(chuàng)建兩個不同的實(shí)現(xiàn)類表示不同的零部件產(chǎn)品
public interface ITire {
//輪胎接口
void tire();
}
public class NormalTire implements ITire {
@Override
public void tire() {
System.out.println("普通輪胎");
}
}
public class SUVTire implements ITire {
@Override
public void tire() {
System.out.println("越野輪胎");
}
}
public interface IEngin {
//發(fā)動機(jī)
void engine();
}
public class DomesticEngin implements IEngin {
@Override
public void engine() {
System.out.println("國產(chǎn)發(fā)動機(jī)");
}
}
public class ImportEngin implements IEngin {
@Override
public void engine() {
System.out.println("進(jìn)口發(fā)動機(jī)");
}
}
public interface IBrake {
//制動系統(tǒng)
void brake();
}
public class NormalBrake implements IBrake {
@Override
public void brake() {
System.out.println("普通制動");
}
}
public class SeniorBrake implements IBrake {
@Override
public void brake() {
System.out.println("高級制動");
}
}
具體的 不同的生產(chǎn) 車廠 Q3 生產(chǎn)廠
public class Q3Factory extends CarFactory {
@Override
public ITire createTire() {
return new NormalTire(); //返回普通的輪胎類
}
@Override
public IEngin createEngine() {
return new DomesticEngin(); //返回國產(chǎn)發(fā)動機(jī)
}
@Override
public IBrake createBrake() {
return new NormalBrake(); //返回一般制動
}
}
具體的 不同的生產(chǎn) 車廠 Q7 生產(chǎn)廠
public class Q7Factory extends CarFactory {
@Override
public ITire createTire() {
return new SUVTire(); //返回SUV 車胎
}
@Override
public IEngin createEngine() {
return new ImportEngin(); //返回進(jìn)口輪胎
}
@Override
public IBrake createBrake() {
return new SeniorBrake(); //返回高級制動
}
}
客戶類 具體的實(shí)例化調(diào)用 生產(chǎn)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//構(gòu)造一個生產(chǎn)Q3 的工廠
CarFactory factoryQ3 = new Q3Factory();
factoryQ3.createTire().tire();
factoryQ3.createEngine().engine();
factoryQ3.createBrake().brake();
//構(gòu)造一個 生產(chǎn)Q7 的 工廠
CarFactory factoryQ7 = new Q7Factory();
factoryQ7.createTire().tire();
factoryQ7.createEngine().engine();
factoryQ7.createBrake().brake();
}
}
結(jié)果如下
9.png
可見當(dāng)需要添加Q5時,對應(yīng)的零件類又要增加,這是此模式一個弊端,就是類的徒增,如果工廠類過多,勢必導(dǎo)致文件非常多,開發(fā)中一定要權(quán)衡。
五、模式的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
分離接口與實(shí)現(xiàn),客戶端使用抽象工廠來創(chuàng)建需要的對象,二客戶端根本不知道具體實(shí)現(xiàn)的是誰,客戶端只是面向產(chǎn)品的接口編程而已,使其從具體的產(chǎn)品實(shí)現(xiàn)中解耦,同時基于接口與實(shí)現(xiàn)的分離,使抽象工廠方法模式在切換產(chǎn)品類時更加靈活,容易。
缺點(diǎn):
一是文件的爆炸性增加,而是不太容易擴(kuò)展新的產(chǎn)品類,因?yàn)槊慨?dāng)我們增加一個產(chǎn)品類就需要修改抽象工廠,那么所以的具體工廠均會被修改。
總結(jié)
以上是生活随笔為你收集整理的android 工厂模式创建,7、Android设计模式---(创建型设计模式)抽象工厂模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux启动tomcat命令行关闭后服
- 下一篇: HTML+CSS+JS实现美女照片3D立