设计模式探秘之抽象工厂模式
Posted 洋葱头么
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式探秘之抽象工厂模式相关的知识,希望对你有一定的参考价值。
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
小明如愿的买到了奔驰车,但是发现座椅有些不合适,仔细一看,居然是奥迪座椅
/**
* 座椅
*/
public interface Seat {
void name();
}
/**
* 奥迪座椅
*/
public class SeatAudi implements Seat {
@Override
public void name() {
System.out.println("奥迪座椅");
}
}
/**
* 奔驰座椅
*/
public class SeatMercedes implements Seat {
@Override
public void name() {
System.out.println("奔驰座椅");
}
}
/**
* 车轮
*/
public interface Wheel {
void name();
}
/**
* 奥迪车轮
*/
public class WheelAudi implements Wheel {
@Override
public void name() {
System.out.println("奥迪车轮");
}
}
/**
* 奔驰车轮
*/
public class WheelMercedes implements Wheel {
@Override
public void name() {
System.out.println("奔驰车轮");
}
}
/**
* 汽车工厂
*/
public interface CarFactory {
/**
* 座椅
* @return
*/
Seat createSeat();
/**
* 车轮
* @return
*/
Wheel createWheel();
}
/**
* 奥迪汽车
*/
public class AudiFactory implements CarFactory {
/**
* 奥迪座椅
* @return
*/
@Override
public Seat createSeat() {
return new SeatAudi();
}
/**
* 奥迪车轮
* @return
*/
@Override
public Wheel createWheel() {
return new WheelAudi();
}
}
/**
* 奔驰汽车
*/
public class MercedesFactory implements CarFactory {
/**
* 奔驰座椅
* @return
*/
@Override
public Seat createSeat() {
return new SeatMercedes();
}
/**
* 奔驰车轮
* @return
*/
@Override
public Wheel createWheel() {
return new WheelMercedes();
}
}
/**
* 测试
*/
public class Demo {
public static void main(String[] args) {
CarFactory carFactory = new MercedesFactory();
carFactory.createSeat().name();
carFactory.createWheel().name();
}
}
座椅和车轮应当是匹配的或者说相互依赖的,不能把奥迪的座椅安装到奔驰车上面;这里汽车产品由座椅和车轮两部分组成,在生产汽车的时候要同时生产座椅和车轮并且两者匹配才能够生产完成;我们可以看到CarFactory定义的生产座椅和车轮的方法延迟到了具体的工厂实现,所以可以看成是工厂方法,而座椅和车轮相互依赖则构成了产品簇。
优点:面向接口编程,外部调用与内部实现解耦,易于切换产品簇。
缺点:产品簇和产品组成较多的时候比较复杂,产品簇新增产品不容易扩展。
可以看到,“简单工厂->工厂方法->抽象工厂”一步步升级,更加灵活但同时也带来了复杂性的提升。抽象工厂模式本质上是选择产品簇的实现,什么时候使用呢?仔细阅读定义和理解代码实现,不难得出结论即接口相互依赖的时候最适合使用,比如要么都保存到内存数据库要么都保存到关系型数据库,你学会了吗?
以上是关于设计模式探秘之抽象工厂模式的主要内容,如果未能解决你的问题,请参考以下文章