抽象工厂方法模式
定义:
为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类
应用场景
对象族有相同的规范或者说是约束
抽象工厂方法写法
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中也是极少的,一般使用工厂模式即可满足需求