定义
为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定他们的具体实现类。
Android 源码中使用抽象工厂模式
MediaPlayer
特点
-
优点:
分离接口与实现,客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已,使其从具体的产品实现中解耦,同时基于接口与实现分离,使抽象该工厂方法模式在切换产品类时更加灵活、容易。 -
缺点:
一是对类文件的爆炸性增加,二是不太容易扩展新的产品类。
使用场景
一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。例如一个文本编辑器和一个图片处理器,都是软件实体,但是 Linux 下的文本编辑器和 Windows 下的文本编辑器虽然功能和界面都相同,但是代码实现是不同的,图片处理器也是类似情况,也就是具有了共同的约束条件:操作系统类型,于是我们可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。
简单实现
以车厂生产汽车零部件为例,A、B两家车厂分别生产不同的轮胎、发动机、制动系统。虽然生产的零件不同,型号不同。但是根本上都有共同的约束,就是轮胎、发动机、制动系统。
轮胎相关类:
public interface ITire {
void tire();
}
---------------------------
public class NormalTire implements ITire {
@Override
public void tire() {
Log.d("TAG", "普通轮胎");
}
}
---------------------------
public class SUVTire implements ITire {
@Override
public void tire() {
Log.d("TAG", "SUV轮胎");
}
}
引擎相关类:
public interface IEngine {
void engine();
}
---------------------------
public class DomesticEngine implements IEngine {
@Override
public void engine() {
Log.d("TAG", "国产发动机 ");
}
}
---------------------------
public class ImportEngine implements IEngine {
@Override
public void engine() {
Log.d("TAG", "进口发动机 ");
}
}
制动相关类:
public interface IBrake {
void brake();
}
---------------------------
public class NormalBrake implements IBrake {
@Override
public void brake() {
Log.d("TAG", "普通制动");
}
}
---------------------------
public class SeniorBrake implements IBrake {
@Override
public void brake() {
Log.d("TAG", "高级制动");
}
}
工厂相关类:
public abstract class CarFactory {
public abstract ITire createTire();
public abstract IEngine createEngine();
public abstract IBrake createBrake();
}
---------------------------
public class AFactory extends CarFactory {
@Override
public ITire createTire() {
return new NormalTire();
}
@Override
public IEngine createEngine() {
return new DomesticEngine();
}
@Override
public IBrake createBrake() {
return new NormalBrake();
}
}
---------------------------
public class BFactory extends CarFactory {
@Override
public ITire createTire() {
return new SUVTire();
}
@Override
public IEngine createEngine() {
return new ImportEngine();
}
@Override
public IBrake createBrake() {
return new SeniorBrake();
}
}
使用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
}
private void initData() {
CarFactory factoryA = new AFactory();
factoryA.createTire().tire();
factoryA.createEngine().engine();
factoryA.createBrake().brake();
Log.d("TAG", "-------------");
CarFactory factoryB = new BFactory();
factoryB.createTire().tire();
factoryB.createEngine().engine();
factoryB.createBrake().brake();
}
}
结果:
2019-04-03 14:26:07 普通轮胎
2019-04-03 14:26:07 国产发动机
2019-04-03 14:26:07 普通制动
2019-04-03 14:26:07 -------------
2019-04-03 14:26:07 SUV轮胎
2019-04-03 14:26:07 进口发动机
2019-04-03 14:26:07 高级制动













网友评论