定义:
- 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
优势:
- 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。
- 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。
- 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
劣势:
- 在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便
- 开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)
工厂接口 | 生成一系类目标类的方法的抽象类 |
工厂实现类 | 实现接口,生成一系类目标对象方法,返回 |
目标类接口(多个) | 一系类产品对象接口 |
目标类实现类 | 目标接口的实现类 |
UML图:
工厂类接口:
package com.project.factory.abstractfactory;
public interface ICarFactory {
/**
* 发动机
* @return
*/
public IEngine engine();
/**
* 座椅
* @return
*/
public ISeat seat();
/**
* 轮胎
* @return
*/
public ITyre tyre();
}
工厂类实现类:
package com.project.factory.abstractfactory.impl;
import com.project.factory.abstractfactory.ICarFactory;
import com.project.factory.abstractfactory.IEngine;
import com.project.factory.abstractfactory.ISeat;
import com.project.factory.abstractfactory.ITyre;
public class LuxuryCarFactory implements ICarFactory{
@Override
public IEngine engine() {
return new LuxuryEngine();
}
@Override
public ISeat seat() {
return new LuxurySeat();
}
@Override
public ITyre tyre() {
return new LuxuryTyre();
}
}
package com.project.factory.abstractfactory.impl;
import com.project.factory.abstractfactory.ICarFactory;
import com.project.factory.abstractfactory.IEngine;
import com.project.factory.abstractfactory.ISeat;
import com.project.factory.abstractfactory.ITyre;
public class LowCarFactory implements ICarFactory {
@Override
public IEngine engine() {
return new LowEngine();
}
@Override
public ISeat seat() {
return new LowSeat();
}
@Override
public ITyre tyre() {
return new LowTyre();
}
}
目标类接口:
package com.project.factory.abstractfactory;
public interface IEngine {
/**
* 发动机跑得快
*/
public void engine();
}
package com.project.factory.abstractfactory;
public interface ISeat {
/**
* 座椅舒服
*/
public void seat();
}
package com.project.factory.abstractfactory;
public interface ITyre {
/**
* 轮胎磨损
*/
public void tyre();
}
目标类实现类:
package com.project.factory.abstractfactory.impl;
import com.project.factory.abstractfactory.IEngine;
public class LowEngine implements IEngine {
@Override
public void engine() {
System.out.println("差的发动机跑得慢");
}
}
package com.project.factory.abstractfactory.impl;
import com.project.factory.abstractfactory.ISeat;
public class LowSeat implements ISeat {
@Override
public void seat() {
System.out.println("差的座椅不舒服");
}
}
package com.project.factory.abstractfactory.impl;
import com.project.factory.abstractfactory.ITyre;
public class LowTyre implements ITyre {
@Override
public void tyre() {
System.out.println("差的轮胎磨损高");
}
}
package com.project.factory.abstractfactory.impl;
import com.project.factory.abstractfactory.IEngine;
public class LuxuryEngine implements IEngine {
@Override
public void engine() {
System.out.println("好的发动机跑得快");
}
}
package com.project.factory.abstractfactory.impl;
import com.project.factory.abstractfactory.ISeat;
public class LuxurySeat implements ISeat {
@Override
public void seat() {
System.out.println("好的座椅舒服");
}
}
package com.project.factory.abstractfactory.impl;
import com.project.factory.abstractfactory.ITyre;
public class LuxuryTyre implements ITyre {
@Override
public void tyre() {
System.out.println("好的轮胎磨损小");
}
}
测试类:
package com.project.factory.abstractfactory;
import com.project.factory.abstractfactory.impl.LowCarFactory;
import com.project.factory.abstractfactory.impl.LuxuryCarFactory;
public class Client {
public static void main(String[] args) {
ICarFactory fatoryLuxury = new LuxuryCarFactory();
IEngine engineLuxury = fatoryLuxury.engine();
engineLuxury.engine();
ICarFactory fatoryLow = new LowCarFactory();
IEngine engineLow = fatoryLow.engine();
engineLow.engine();
}
}