android 抽象实体,Android设计模式-5-抽象工厂模式

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();

}

}

我是今阳,如果想要进阶和了解更多的干货,欢迎关注公众号”今阳说“接收我的最新文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值