工厂模式在《Java 与模式》中分为三类:这三种模式从上到下逐步抽象,并且更具一般性
GOF 在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。
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 SimpleFactory {
//工厂方法.注意返回类型为抽象产品角色
public static Car driverCar(String s) throws Exception {
if (s.equalsIgnoreCase("Benz")) {
return new Benz();
} else if (s.equalsIgnoreCase("Bmw")) {
return new Bmw();
}else {
throw new Exception();
}
}
}
public class Main {
public static void main(String[] args) throws Exception {
Car car = SimpleFactory.driverCar("benz");
car.drive();
}
}
public interface CarFactory {
Car driverCar();
}
public class BenzFactory implements CarFactory{
@Override
public Car driverCar() {
return new Benz();
}
}
public class BmwFactory implements CarFactory{
@Override
public Car driverCar() {
return new Bmw();
}
}
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 Main {
public static void main(String[] args) throws Exception {
// Car car = SimpleFactory.driverCar("benz");
CarFactory factory = new BmwFactory();
Car car = factory.driverCar();
car.drive();
}
}
看完这个例子家应该很明白工厂方法和简单工厂的区别了,简单工厂就是所有产品都由一个工厂类一个方法来创建,而工厂方法将工厂的职责也进行细化了,每种产品都由自己特定的工厂来生产,这也是单一职责原则的体现。
产品族: 位于不同产品等级结构中,功能相关联的产品组成的家族。
假设BmwFactory,BenzFactory不但造汽车,还制造飞机 坦克.
而BmwFactory 和BenzFactory 就是两个产品树(产品层次结构);
public interface AbstractFactory {
//制造汽车
abstract Car driverCar();
//制造飞机
abstract plane driverPlane();
//制造坦克
abstract tank driverTank();
}
public class BenzFactory implements AbstractFactory {
@Override
public Car driverCar() {
return new BenzCar();
}
@Override
public plane driverPlane() {
return new BenzPlane();
}
@Override
public tank driverTank() {
return new BenzTank();
}
}
public class BmwFactory implements AbstractFactory {
@Override
public Car driverCar() {
return new BmwCar();
}
@Override
public plane driverPlane() {
return new BmwPlane();
}
@Override
public tank driverTank() {
return new BmwTank();
}
}
public class Main {
public static void main(String[] args) throws Exception {
AbstractFactory factory = new BmwFactory();
Car car = factory.driverCar();
plane plane = factory.driverPlane();
tank tank = factory.driverTank();
car.drive();
plane.drive();
tank.drive();
}
}
抽象工厂模式为创建一组对象提供了一种解决方案。 与工厂方法模式相比, 抽象工厂模式中的具体工厂不只是创建一种具体对象,它负责创建一组(族)具体对象。
当我们有一系列产品(如上面的car,tank,plane)。而这一系列产品每种产品又需要具有不同的创建方法
在 Spring 中,BeanFactory 是用于管理 Bean 的一个工厂,所有工厂都是 BeanFactory 的子类。这样我们可以通过 IOC 容器来管理访问 Bean,根据不同的策略调用 getBean() 方法,从而获得具体对象。
BeanFactory 的子类主要有 ClassPathXmlApplicationContext、XmlWebApplicationContext、StaticWebApplicationContext、StaticApplicationContext。
在 Spring 中,DefaultListableBeanFactory 实现了所有工厂的公共逻辑。