1. 简单工厂模式(Simple Factory)
2. 工厂方法模式(Factory Method)
3. 抽象工厂模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。下面是使用工厂模式的两种情况:
1.在编码时不能预见需要创建哪种类的实例。
2.系统不应依赖于产品类实例如何被创建、组合和表达的细节
现在给大家讲一下工厂方法设计模式.首先大家先理解一下工厂方法的概念
(1)模式的功能
工厂方法的主要功能是让父类在不知道具体实现的情况下,完成自身的功能调用,而具体的实现延迟到子类来实现。
这样在设计的时候,不用去考虑具体的实现,需要某个对象,把它通过工厂方法返回就好了,在使用这些对象实现功能的时候还是通过接口来操作,这非常类似于IoC/DI的思想,这个在后面给大家稍详细点介绍一下。
(2)实现成抽象类
工厂方法的实现中,通常父类会是一个抽象类,里面包含创建所需对象的抽象方法,这些抽象方法就是工厂方法。
这里要注意一个问题,子类在实现这些抽象方法的时候,通常并不是真的由子类来实现具体的功能,而是在子类的方法里面做选择,选择具体的产品实现对象。
父类里面,通常会有使用这些产品对象来实现一定的功能的方法,而且这些方法所实现的功能通常都是公共的功能,不管子类选择了何种具体的产品实现,这些方法的功能总是能正确执行。
(3)实现成具体的类
当然也可以把父类实现成为一个具体的类,这种情况下,通常是在父类中提供获取所需对象的默认实现方法,这样就算没有具体的子类,也能够运行。
通常这种情况还是需要具体的子类来决定具体要如何创建父类所需要的对象。也把这种情况称为工厂方法为子类提供了挂钩,通过工厂方法,可以让子类对象来覆盖父类的实现,从而提供更好的灵活性。
(4)工厂方法的参数和返回
工厂方法的实现中,可能需要参数,以便决定到底选用哪一种具体的实现。也就是说通过在抽象方法里面传递参数,在子类实现的时候根据参数进行选择,看看究竟应该创建哪一个具体的实现对象。
一般工厂方法返回的是被创建对象的接口对象,当然也可以是抽象类或者一个具体的类的实例。
下面给大家用代码描述一下工厂方法的使用
Car.java
public interface Car {
public void drive();
}
Bmw.java
public class Bmw implements Car {
@Override
public void drive() {
// TODO Auto-generated method stub
System.out.println("driving BMW");
}
}
Benz.java
public class Benz implements Car {
@Override
public void drive() {
// TODO Auto-generated method stub
System.out.println("driving BENZ");
}
}
Driver.java
public interface Driver {
public Car driverCar();
}
BmwDriver.java
public class BmwDriver implements Driver {
@Override
public Car driverCar() {
// TODO Auto-generated method stub
return new Bmw();
}
}
BenzDriver.java
public class BenzDriver implements Driver {
@Override
public Car driverCar() {
// TODO Auto-generated method stub
return new Benz();
}
}
Magnate.java
public class Magnate {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
Driver driver = new BmwDriver();
Car car = driver.driverCar();
car.drive();
}catch(Exception e){
e.printStackTrace();
}
}
}