1.定义说明
- 抽象工厂,顾名思义生产的产品是不确定的
- 为创建一组对象提供一个接口,而不需要指定它们的具体类
2.UML类图
- 角色介绍
AbstractFactory : 抽象工厂
ConcreteFactory1 : 具体工厂1
ConcreteFactory2 : 具体工厂2
AbstractProductA : 抽象产品A
AbstractProductB : 抽象产品B
- 要点
抽象/具体工厂都是生产抽象产品
3.UML示例代码
public abstract class AbstractFactory {
public abstract IEngine createEngine();
public abstract ITile createTile();
}
public class BYDQinFactory extends AbstractFactory {
public BYDQinFactory() {
Log.i("Factory", "BYD秦 工厂");
}
@Override
public IEngine createEngine() {
return new DomesticEngine();
}
@Override
public ITile createTile() {
return new NormalTile();
}
}
public class BYDTangFactory extends AbstractFactory {
public BYDTangFactory() {
Log.i("Factory", "BYD唐 工厂");
}
@Override
public IEngine createEngine() {
return new ImportEngine();
}
@Override
public ITile createTile() {
return new RacingTile();
}
}
public interface IEngine {
void desc();
}
public class DomesticEngine implements IEngine {
@Override
public void desc() {
Log.i("Engine", "国产发动机");
}
}
public class ImportEngine implements IEngine {
@Override
public void desc() {
Log.i("Engine", "进口发动机");
}
}
public interface ITile {
void desc();
}
public class NormalTile implements ITile {
@Override
public void desc() {
Log.i("Tile", "普通轮胎");
}
}
public class RacingTile implements ITile {
@Override
public void desc() {
Log.i("Tile", "赛车轮胎");
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onResume() {
super.onResume();
AbstractFactory qinFactory = new BYDQinFactory();
qinFactory.createEngine().desc();
qinFactory.createTile().desc();
AbstractFactory tangFactory = new BYDTangFactory();
tangFactory.createEngine().desc();
tangFactory.createTile().desc();
}
}
4.总结
- 优点与缺点
优点:接口与实现分离,面向产品的接口编程,使其从具体的产品实现中解耦
缺点:类文件繁多;扩展新的抽象产品类不方便,需要同步修改抽象工厂
- 使用建议
若工厂类较多,则会带来更多的类文件,实际开发中权衡使用
- 工厂方法模式与抽象工厂模式比较
前者:具体工厂生产具体产品
后者:具体工厂生产抽象产品