工厂模式有三种:
1、简单工厂模式(Simple Factory Pattern)
简单工厂模式又称之为静态工厂方法,属于创建型模式。是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。eg:
抽象类:
public interface Car {
void drive();
}
具体实现:
public class Benz implements Car {
@Override
public void drive() {
System.out.println("Driving Benz ");
}
}
public class Bmw implements Car {
@Override
public void drive() {
System.out.println("Driving Bmw ");
}
}
工厂类:
public class Driver {
public static Car driverCar(String s) {
if (s.equalsIgnoreCase("Benz")) {
return new Benz();
} else if (s.equalsIgnoreCase("Bmw")) {
return new Bmw();
}
return null;
}
}
调用:
Car car = Driver.driverCar("Benz");
car.drive();
优点:简单工厂模式将对象的创建和对象本身业务处理分离,降低耦合度。
缺点:增加了系统中类的个数,在一定程度上增加了系统的复杂度和理解难度。并且他不符合开闭原则(对扩展开放、对修改关闭),每增加一个类,都要在工厂类中增加相应的判断逻辑。
2、工厂方法模式(Factory Method Pattern)
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式让实例化推迟到子类。
eg:
抽象类:
public interface Car {
void drive();
}
具体实现:
public class Benz implements Car {
@Override
public void drive() {
System.out.println("Driving Benz ");
}
}
public class Bmw implements Car {
@Override
public void drive() {
System.out.println("Driving Bmw ");
}
}
抽象工厂:
public interface Driver {
Car driverCar();
}
具体工厂:
public class BenzDriver implements Driver {
@Override
public Car driverCar() {
return new Benz();
}
}
public class BmwDriver implements Driver {
@Override
public Car driverCar() {
return new Bmw();
}
}
调用:
Driver driver = new BenzDriver();
Car car = driver.driverCar();
car.drive();
优点: 在工厂方法模式中,用户只需要知道创建对象的具体工厂,不用知道对象具体的创建过程。在增加新的类时,只需增加一个具体类和对应的实现工厂,符合“开闭原则”。
缺点:类会越来越多,增加了系统的复杂度。
3、抽象工厂模式(Abstract Factory Parrern)
在工厂方法模式中一个具体的工厂对应一个具体的对象。但是有时候我们需要一个工厂能够提供多个相关或相互依赖对象,而不是单一的对象,这个时候我们就需要使用抽象工厂模式。
eg: 接着上面的工厂模式写
抽象工厂:
public interface Driver {
Car driverCar();
Bike driverBike();
}
具体工厂:
public class MMDriver implements Driver {
@Override
public Car driverCar() {
return new Benz();
}
@Override
public Bike driverBike() {
return new HelloBike();
}
}
调用:
Driver driver = new MMDriver();
driver.driverCar();
driver.driverBike();
优缺点同工厂方法模式