Android设计模式-5-抽象工厂模式
2021-01-04 本文已影响0人
今阳说
1. 定义:
-
提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;由具体的工厂负责实现具体的产品实例。
-
与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类
-
可以理解为工厂模式只有一个维度,就是同一产品类下的不同产品;而抽象工厂模式有两个维度,不同的产品族和每个产品族下不同的产品
2. 优缺点
- 优点:
-
降低耦合,将具体产品的创建延迟到具体工厂的子类中
-
易于扩展,新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可
-
有利于产品的一致性
-
不使用静态工厂方法,可以形成基于继承的等级结构。
-
缺点:当需要新增产品族时,需要修改工厂基类,不符合开闭原则
-
对于新的产品种类符合开-闭原则, 对于新的产品族不符合开-闭原则, 这一特性称为开-闭原则的倾斜性。
3. 实例演示:
如下例子,就是可以方便的创建ADBCDEFG等不同的monky和dunky,但不能创建其他种类的动物
- 首先是基类
abstract class Animal {
public abstract void show();
}
abstract class Monky extends Animal {
@Override
public abstract void show();
}
abstract class Dunky extends Animal {
@Override
public abstract void show();
}
- 然后创建工厂基类
abstract class AnimalFactory {
public abstract Monky newMonky();
public abstract Dunky newDunky();
}
- 具体的动物类
class MonkyA extends Monky {
@Override
public void show() {
LjyLogUtil.i("MonkyA:齐天大圣孙悟空");
}
}
class DunkyA extends Dunky {
@Override
public void show() {
LjyLogUtil.i("DunkyA:阿凡驴的提");
}
}
class MonkyB extends Monky {
@Override
public void show() {
LjyLogUtil.i("MonkyB:六耳弥猴桃");
}
}
class DunkyB extends Dunky {
@Override
public void show() {
LjyLogUtil.i("DunkyB:赶集的小毛驴");
}
}
- 具体的工厂类
class AnimalFactoryA extends AnimalFactory {
@Override
public Monky newMonky() {
return new MonkyA();
}
@Override
public Dunky newDunky() {
return new DunkyA();
}
}
class AnimalFactoryB extends AnimalFactory {
@Override
public Monky newMonky() {
return new MonkyB();
}
@Override
public Dunky newDunky() {
return new DunkyB();
}
}
- 使用具体的工厂类创建产品
private void methodAbstractFactoryPattern() {
AnimalFactoryA factoryA = new AnimalFactoryA();
factoryA.newMonky().show();
factoryA.newDunky().show();
AnimalFactoryB factoryB = new AnimalFactoryB();
factoryB.newMonky().show();
factoryB.newDunky().show();
}
- 当新增具体种类C时,只需通过继承基类创建具体的动物类,继承工厂基类创建具体的工厂类即可
class MonkyC extends Monky {
@Override
public void show() {
LjyLogUtil.i("MonkyC:第三种猴子");
}
}
class DunkyC extends Dunky {
@Override
public void show() {
LjyLogUtil.i("DunkyC:第三种驴");
}
}
class AnimalFactoryC extends AnimalFactory {
@Override
public Monky newMonky() {
return new MonkyC();
}
@Override
public Dunky newDunky() {
return new DunkyC();
}
}