工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
分类:
- 简单工厂模式(Simple Factory)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abtract Factory)
简单工厂模式
简单工厂模式又称静态工厂方法模式。目的:定义一个用于创建对象的接口。
- 工厂类角色:有一定的商业逻辑和判断逻辑。【一个具体类实现】
- 抽象产品角色:具体产品继承的父类或者实现的接口。【接口或者抽象类实现】
- 具体产品角色:工厂类所创建的对象就是此角色的实例。【具体类实现】
interface Car {
public void drive();
}
class Benz implements Car{
@Override
public void drive() {
System.out.println("Driving Benz");
}
}
class Bmw implements Car{
@Override
public void drive() {
System.out.println("Driving Bmw");
}
}
class Audi implements Car{
@Override
public void drive() {
System.out.println("Driving Audi");
}
}
class Driver{
// 工厂方法: 返回类型为抽象产品角色
public static Car driverCar(String s) throws Exception{
// 判断逻辑,返回具体的产品角色
if (s.equalsIgnoreCase("Benz")){
return new Benz();
} else if (s.equalsIgnoreCase("Bmw")){
return new Bmw();
} else if (s.equalsIgnoreCase("Audi")){
return new Audi();
} else {
throw new Exception();
}
}
}
public class Magnate{
public static void main(String[] args) {
try{
Car car = Driver.driverCar("benz");
car.drive();
} catch (Exception e){
e.printStackTrace();
}
}
}
优缺点:
每增加一个产品的时候,只要符合抽象接口就可以被下层消费。但是每增加一个产品,都需要更改driverCar这个工厂中的判断逻辑和业务逻辑。
工厂方法模式
工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。
它的组成:
- 抽线工厂角色:这是工厂方法模式的核心,它与应用程序无关。【抽象类或者接口】
- 具体工厂角色:含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品对象。
- 抽象产品角色:具体产品继承的父类或者是实现的接口。【抽象类或者接口实现】
- 具体产品角色:具体工厂所创建的对象就是此角色的实例。【具体类实现】
package 工厂模式;
interface Car {
void drive();
}
interface Driver{
Car driverCar();
}
class Benz implements Car{
@Override
public void drive() {
System.out.println("Driving Benz");
}
}
class Bmw implements Car{
@Override
public void drive() {
System.out.println("Driving Bmw");
}
}
class Audi implements Car{
@Override
public void drive() {
System.out.println("Driving Audi");
}
}
class BenzDriver implements Driver{
@Override
public Car driverCar() {
return new Benz();
}
}
class BmwDriver implements Driver{
@Override
public Car driverCar() {
return new Bmw();
}
}
class AudiDriver implements Driver{
@Override
public Car driverCar() {
return new Audi();
}
}
public class Magnate{
public static void main(String[] args) {
try{
Driver driver = new BenzDriver();
driver.driverCar().drive();
} catch (Exception e){
e.printStackTrace();
}
}
}
在简单工厂模式中,新产品的加入要修改工厂角色中的判断语句;而在工厂方法模式中,要么将判断逻辑留在抽象工厂角色中,要么在客户端程序中将工厂角色写死。面对这种情况,Java的反射机制与配置文件的结合突破了限制---Spring。