上一节 23种设计模式之工厂方法模式
抽象工厂模式
1、用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
2、抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需的对象是一种非常好的解决方式
类图:
产品族(在此为了方便接口和实现放在了同一文件中):
//产品一
public interface Engine {
void run();
void start();
}
class LuxuryEngine implements Engine{
@Override
public void run() {
System.out.println("跑得快!");
}
@Override
public void start() {
System.out.println("自动测停!");
}
}
class LowEngine implements Engine{
@Override
public void run() {
System.out.println("跑得慢!");
}
@Override
public void start() {
System.out.println("不可自动测停!");
}
}
//产品二
public interface Seat {
void massage();
}
class LuxurySeat implements Seat{
@Override
public void massage() {
System.out.println("有按摩功能!");
}
}
class LowSeat implements Seat{
@Override
public void massage() {
System.out.println("没有按摩功能!");
}
}
public interface Tyre {
void revolve();
}
class LuxuryTyre implements Tyre{
@Override
public void revolve() {
System.out.println("轮胎磨损快!");
}
}
class LowTyre implements Tyre{
@Override
public void revolve() {
System.out.println("轮胎磨损慢!");
}
}
工厂接口及其实现类:
public abstract class CarFactory {
abstract Engine createEngine();
abstract Seat createSeat();
abstract Tyre createTyre();
}
public class LuxuryCarFactory extends CarFactory {
public Engine createEngine() {
return new LuxuryEngine();
}
public Seat createSeat() {
return new LuxurySeat();
}
public Tyre createTyre() {
return new LuxuryTyre();
}
}
public class LowCarFactory extends CarFactory {
public Engine createEngine() {
return new LowEngine();
}
public Seat createSeat() {
return new LowSeat();
}
public Tyre createTyre() {
return new LowTyre();
}
}
测试类:
public class Test1 {
public static void main(String[] args) {
CarFactory carFactory = new LowCarFactory();
Engine e = carFactory.createEngine();
e.run();
e.start();
}
}
测试结果:
跑得慢!
不可自动测停!
工厂模式要点
1、简单工厂模式(静态工厂模式)
虽然某种程度不符合设计原则,但实际使用最多。
2、工厂方法模式
不修改已有类的前提下,通过增加新的工厂类实现扩展。
3、抽象工厂模式
不可以增加产品,可以增加产品族
应用场景
1、JDK中Calendar的getInstance方法
2、JDBC中Connection对象的获取
3、Hibernate中SessionFactory创建Session
4、spring中IOC容器创建管理bean对象
5、XML解析时的DocumentBuilderFactory创建解析器对象
6、反射中Class对象的newInstance()
抽象工厂模式的优点
1、良好的封装性
2、产品族内的约束为非公开状态
抽象工厂模式的缺点
产品族扩展困难。注意是产品族内的产品。
下一节 23种设计模式之建造者模式