Android源码看设计模式(四)--------基于抽象工厂方法模式的MediaPlayer相关分析

抽象工厂方法模式

定义:

为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类

应用场景

对象族有相同的规范或者说是约束

抽象工厂方法写法

UML图如下:
这里写图片描述

  • AbstractFactory:抽象工厂,它声明了用来创建不同产品的方法。
  • ConcreteFactory:具体工厂,实现抽象工厂中定义的创建产品的方法。
  • AbstractProduct:抽象产品,为每种产品声明业务方法。比如上图的AbstractProductA和 AbstractProductB。
  • ConcreteProduct:具体产品,定义具体工厂生产的具体产品,并实现抽象产品中定义的业务方法。

其实这里我们就可以看出抽象工厂方法模式是工厂方法模式的升级,解决工厂方法模式只能生产一种产品的弊端

定义抽象产品类

//衣服
public abstract class Clothes {
    public abstract void produce();
}

//鞋子
public abstract class Shoes {
    public abstract void produce();
}

定义两个抽象产品类Clothes和Shoes ,同时定义了了一个produce方法用来生产

创建具体产品

public class AClothes extends Clothes {
    @Override
    public void produce() {
        System.out.println("生产A类型的衣服");
    }
}

public class BClothes extends Clothes {
    @Override
    public void produce() {
        System.out.println("生产B类型的衣服");
    }
}

public class AShoes extends Shoes {
    @Override
    public void produce() {
        System.out.println("生产A类型的鞋子");
    }
}

public class BShoes extends Shoes {
    @Override
    public void produce() {
        System.out.println("生产B类型的鞋子");
    }
}

定义抽象工厂

public abstract class CreateFactory {
    //生产衣服
    public abstract Clothes createClothes();
    //生产鞋子
    public abstract Shoes createShoes();
}

这里就可以明显看到抽象工厂方法模式和工厂方法模式的不同了,在抽象工厂方法模式中是可以产生多个产品实例

创建具体工厂

//A工厂
public class AcreateFactory extends CreateFactory {
    @Override
    public Clothes createClothes() {
        //生产A类型的衣服
        return new AClothes();
    }

    @Override
    public Shoes createShoes() {
        //生产A类型的鞋子
        return AShoes();
    }
}

//B工厂
public class BcreateFactory extends CreateFactory {
    @Override
    public Clothes createClothes() {
        //生产B类型的衣服
        return new BClothes();
    }

    @Override
    public Shoes createShoes() {
        //生产B类型的鞋子
        return BShoes();
    }
}

客户端调用

public class Client {
    public static void main(String[]args) {
        //A工厂
        CreateFactory AFactory=new AcreateFactory ();
        AFactory.createClothes().produce();
        AFactory.createShoes().produce();
        //B工厂
        CreateFactory BFactory=new BcreateFactory ();
        BFactory.createClothes().produce();
        BFactory.createShoes().produce();
    }
}

MediaPlayer分析

抽象工厂模式在Android源码中的体现还是比较少的,比较典型的是Android底层对MediaPlayer的创建,这设计到C++的内容,这里也不用再进一步分析,只是说明其中MediaPlayerFactory是Android底层为创建不同的MediaPlayer所定义的一个类,其中就是调用createPlayer函数来创建不同的MediaPlayer,这和我们上面所说的抽象工厂方法的内容是一致的。但是抽象工厂方法模式在实际应用中并不多见,在Android中也是极少的,一般使用工厂模式即可满足需求

猜你喜欢

转载自blog.csdn.net/qq_33768280/article/details/81026453