在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。
使用工厂模式来创建对象,可以不必关心构造对象的具体过长和细节。
一、简单工厂模式
package pattern;
//simple Factory
abstract class Car{
void describe(){};
}
class Bigcar extends Car{
public void describe(){System.out.println("bigcar");}
}
class Middlecar extends Car{
public void describe(){System.out.println("Middlecar");}
}
class Smallcar extends Car{
public void describe(){System.out.println("Smallcar");}
}
class Factory{
public Car createCar(String type){
switch(type){
case "Bigcar":return new Bigcar();
case "Middlecar":return new Middlecar();
case "Smallcar":return new Smallcar();
default:return null;
}
}
}
public class Client {
public static void main(String[] args){
Factory f =new Factory();
Car bigcar = f.createCar("Bigcar");
bigcar.describe();
Car middlecar = f.createCar("Middlecar");
middlecar.describe();
Car smallcar = f.createCar("Smallcar");
smallcar.describe();
}
}
//输出结果:
bigcar
Middlecar
Smallcar
我们可以看到在这个简单工厂模式中有四种角色
- 抽象产品类:具体产品类的父类或者接口
- 具体产品类:由工厂所创建的具体对象
- 工厂类:模式的核心,含有一定的判断语句
- 客户类:创建工厂类,进而创建具体产品类的实例
二、工厂方法模式
package pattern;
//simple Factory
abstract class Car{
void describe(){};
}
class Bigcar extends Car{
public void describe(){System.out.println("bigcar");}
}
class Middlecar extends Car{
public void describe(){System.out.println("Middlecar");}
}
class Smallcar extends Car{
public void describe(){System.out.println("Smallcar");}
}
abstract class Factory{
public Car createCar(){return null;}
}
class bigFactory extends Factory{
public Car createCar(){
return new Bigcar();
}
}
class middleFactory extends Factory{
public Car createCar(){
return new Middlecar();
}
}
class smallFactory extends Factory{
public Car createCar(){
return new Smallcar();
}
}
public class Client {
public static void main(String[] args){
Factory f1 =new bigFactory();
Factory f2 =new middleFactory();
Factory f3 =new smallFactory();
Car bigcar = f1.createCar();
bigcar.describe();
Car middlecar = f2.createCar();
middlecar.describe();
Car smallcar = f3.createCar();
smallcar.describe();
}
}
我们可以看到在这个简单工厂模式中有五种角色
- 抽象产品类:具体产品类的父类或者接口
- 具体产品类:由工厂所创建的具体对象
- 抽象工厂类:具体工厂类的父类或者接口
- 具体工厂类:有多个具体的工厂类,每个工厂类创建不同的实例,而不是相当于简单工厂模式下的逻辑判断来实现。
- 客户类:创建工厂类,进而创建具体产品类的实例