素材巴巴 > 程序开发 >

Android 中设计模式 ----工厂模式

程序开发 2023-09-09 22:09:17

来源:http://blog.csdn.net/shift_wwx/article/details/79097938

工厂模式分为简单工厂模式,工厂方法模式以及抽象工厂模式


简单工厂模式:

一般情况下,提供一个方法,方法的参数是一个标志位,根据标志位来创建不同的对象,这样调用的时候只需要提供一个标志位就可以创建一个实现了接口的类。

工厂方法模式:

将简单工厂模式的那个方法分开,不再是在工厂方法中根据标志位创建对象了。而是定义一个工厂接口,然后想创建几个不同类型的对象(即实现了同一接口的不同java类),就创建了几个不同类型的工厂。也就是创建的对象和创建对象的工厂是一一对应的。然后客户端调用的时候直接去实例化一个具体的对象工厂,创建相对应的对象。

抽象工厂模式:

其实这个名起的有点不知所云没有表达出这个模式的特点。其实这个模式就是工厂方法模式的稍微扩展一下而已。工厂方法模式里面,一般一个工厂接口只有一个方法,比如createMouse()。然后用实现了这个接口的具体工厂类只能生产鼠标。而抽象工厂模式就是一个工厂接口有多个方法,比如createMouse() , createKeyboard() 。 这样实现了这个工厂接口的具体工厂类就可以既生产鼠标又生产键盘。

 

首先来看下简单工厂模式:

Factory可以根据传入的参数,确定到底生产的是什么产品?

来看个实例:

public class suliao {//基类是塑料public suliao(){}
 }

首先提供一个产品类,这里假如叫塑料。那么可扩展的产品可能有鼠标和键盘,

public class mouse extends suliao {//鼠标材料是塑料public mouse(){}
 }public class keyboard extends suliao {//键盘的材料也是塑料public keyboard(){}
 }

上面创建了不同的产品类,来看下简单工厂模式下的工厂类:

public class Factory {//工厂根据需要(type)生产产品(mouse/keyboard)public suliao createProducts(string type) {if (type.equals("mouse")) {return new mouse();} else if (type.equals("keyboard")) {return new keyboard();}}
 }

正如最开始说的,在工厂类中提供一个方法,这个方法里面有个标志位,这样,工厂创建产品的时候只需要提供一个标志,可以知道什么样的需求,决定生产什么样的产品。
 

再来看下工厂方法模式:

产品类还是一样的:

public class suliao {public suliao(){}
 }public class mouse extends suliao {public mouse(){}
 }public class keyboard extends suliao {public keyboard(){}
 }

只不过工厂类会把生产产品的接口抽象出来:

public interface Factory {suliao createProducts();
 }

有这样的接口,会出现不同的工厂生产不同的产品:

public class mouseFactory extends Factory {//不同的工厂生产固定的产品public suliao createProducts() {return new mouse();}
 }public class keyboardFactory extends Factory {//不同的工厂生产固定的产品public suliao createProducts() {return new keyboard();}
 }

这就是工厂方法模式,抽象出一个工厂的方法,不同的工厂会生产不同的产品。我们也称其为多工厂方法模式。

 

《Design Pattern》中对于工厂方法模式工厂接口有如下表示,这样更简洁、动态,如下:

public class ConcreteFactory extends Factory{public  createProduct(Class clz) {Product p = null;try{p = (Product)Class.forname(clz.getName()).newInstance();} catch(Exception e){e.printStackTrace();}return (T)p;
 }}

 

Android 中工厂方法模式:

public class TestActivity extends Activity {protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new LinearLayout(this));}
 }

Android 中Activity的onCreate() 中会通过setContentView() 将所有的View、ViewGroup、Layout(其实最终都是来源于View)传到framework进行设置。这就产生了Activity A(可以看成一个factory)通过setContentView 产生一个界面(可以看成一个product),Activity B同样通过setContentView 产生另一个界面(另一个product),这个正是工厂方法模式的设计思想。

 

工厂方法模式是一个很好的设计模式,但是缺点也是难以避免的,每次我们为工厂方法模式添加新的产品的时候就要编写一个新的产品类,同事需要引入抽象层,这必然会导致类的结构复杂化。

 

再来看下抽象工厂模式:

产品类和工厂类都有抽象类或者接口类,这个看具体需要。

 

两种产品的抽象代码如下:

public abstract class AbstractProductA {public abstract void methodA();
 }public abstract class AbstractProductB {public abstract void methodB);
 }public class ProductA1 extends AbstractProductA {public void methodA() {//special function for product A1}
 }public class ProductA2 extends AbstractProductA {public void methodA() {//special function for product A2}
 }public class ProductB1 extends AbstractProductB {public void methodB() {//special function for product B1}
 }public class ProductB2 extends AbstractProductB {public void methodB() {//special function for product B2}
 }

工厂类如下:

public interface Factory {AbstractProductA createProductA();AbstractProductA createProductB();
 }public class ConcreteFactoryA implements Factory {@overridepublic AbstractProductA createProductA() {return new ProductA1();}@overridepublic AbstractProductB createProductB() {renturn new ProductB1();}
 }public class ConcreteFactoryB implements Factory {@overridepublic AbstractProductA createProductA() {return new ProductA2();}@overridepublic AbstractProductA createProductB() {renturn new ProductB2();}
 }

 

抽象工厂模式优点:

分离接口与实现,客户端使用抽象工厂来创建所需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已,使其从具体的产品中解耦。

缺点:

会出现很多工厂类、产品类,文件数会增加。另外是不太容易扩展,每当修改一个产品类就需要修改抽象工厂类,那么其他的工厂类都需要跟着修改。

 

 

总结:

简单工厂模式可以看成工厂方法模式的一个特例,工厂方法模式指定固定工厂做固定的产品,当其中一个工厂多做了一个产品,就变成了抽象工厂模式,当抽象工厂模式的工厂做的产品只剩一个,就变成了工厂方法模式。

 

 

更多的设计模式看:Android中设计模式

 

 


标签:

上一篇: Idea右上角Maven按钮各个作用 下一篇:
素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。