您的位置:首页 > 其它

设计模式——抽象工厂模式

2017-11-01 15:17 183 查看
个人理解:

1. 抽象工厂模式是简单工厂模式的升级版,对多个简单工厂模式的Factory类通过FactoryManager进行管理, 工厂管理类通过传入参数生成相应Factory类,Factory生成相应产品

2. 抽象工厂类包含元素:产品抽象类、产品实现类、工厂抽象类、工厂实现类、工厂管理类

3. 抽象工厂模式可以对两级商品的创建进行管理,商品类A、B、C...等多种商品类,A商品类有Aa、Ab...An等多种产品,B商品类有B1、B2...Bn多种产品;Factory类有A产品的Factory类,B产品的Factory类....等等多种商品类的Factory类

如下示例代码:

1. 产品Color&&产品Shape的工厂类继承于同一工厂抽象类 AbstractFactory

2. FactoryManager为工厂管理类,有静态方法 getFactory ,通过传String 参数返回 AbstractFactory

抽象工厂模式Android源码应用

抽象工厂模式在 Android 源码中的实现相对来说是比较少的,其中一个比较确切的例子是 Android 底层对 MediaPlayer 的创建,具体类图如下所示(在新的标签页中打开该图片即可):



四种 MediaPlayerFactory 分别会生成不同的 MediaPlayer 基类:StagefrightPlayer、NuPlayerDriver、MidFile 和 TestPlayerStub ,四者均继承于MediaPlayerBase 。

抽象工厂的优点有很多,一个显著的优点是分离接口与实现,客户端使用抽象工厂来创建需要的对象,它根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已,使其从具体的产品实现中解耦,同时基于接口与实现的分离,使抽象工厂模式在切换产品类时更加灵活、容易。

当然缺点也是很明显的,第一个也是最明显的就是类文件的大大增多,第二个是如果要扩展新的产品类,就需要去修改抽象工厂类的最下层接口,这就会导致所有的具体工厂类均会被修改。

代码示例:

工厂管理类:

public class FactoryManager {

public static AbstractFactory getFactory(String factoryType){
if (TextUtils.isEmpty(factoryType))
return null;
if (factoryType.equals(Constants.EXTRA_FACTORY_TYPE_COLOR)){
return new ColorFactory();
}else if (factoryType.equals(Constants.EXTRA_FACTORY_TYPE_SHAPE)){

4000
return new ShapeFactory();
}else {
return null;
}
}
}


抽象工厂类:

public abstract class AbstractFactory {

public abstract Color getColor(String colorType);

public abstract Shape getShape(String shapeType);

}


产品Color工厂实现类:

public class ColorFactory extends AbstractFactory {

@Override
public Color getColor(String colorType) {
if (TextUtils.isEmpty(colorType)){
return null;
}
if (colorType.equals(Constants.EXTRA_COLOR_BLUE)){
return new BlueColor();
} else if (colorType.equals(Constants.EXTRA_COLOR_RED)){
return new RedColor();
}else {
return null;
}
}

@Override
public Shape getShape(String shapeType) {
return null;
}
}


产品Color抽象类:

public abstract class Color {

public abstract void fill();

}


产品Color实现类:

public class BlueColor extends Color {

@Override
public void fill() {
Log.i("factory_mode", "----------draw: BlueColor---------");
}
}


public class RedColor extends Color {

@Override
public void fill() {
Log.i("factory_mode", "----------draw: RedColor---------");
}
}


产品Shape工厂实现类:

public class ShapeFactory extends AbstractFactory {

@Override
public Color getColor(String colorType) {
return null;
}

@Override
public Shape getShape(String shapeType) {
if (TextUtils.isEmpty(shapeType)){
return null;
}
if (shapeType.equals(Constants.EXTRA_SHAPE_CIRCLE)){
return new ShapeCircle();
} else if (shapeType.equals(Constants.EXTRA_SHAPE_RECTANGLE)){
return new ShapeRectangle();
} else if (shapeType.equals(Constants.EXTRA_SHAPE_SQUARE)){
return new ShapeSquare();
}else {
return null;
}
}
}


产品Shape抽象类:

public abstract class Shape {

public abstract void draw();

}


产品Shape实现类:

public class ShapeCircle extends Shape {

@Override
public void draw() {
Log.i("factory_mode", "----------draw: ShapeCircle---------");
}
}


public class ShapeRectangle extends Shape {

@Override
public void draw() {
Log.i("factory_mode", "----------draw: ShapeRectangle---------");
}
}


public class ShapeSquare extends Shape {

@Override
public void draw() {
Log.i("factory_mode", "----------draw: ShapeSquare---------");
}
}


3. 工厂管理类通过传入参数生成相应Factory类,Factory生成相应产品
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: