在面向对象编程中, 最通常的方法是一个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(); } }
我们可以看到在这个简单工厂模式中有五种角色
- 抽象产品类:具体产品类的父类或者接口
- 具体产品类:由工厂所创建的具体对象
- 抽象工厂类:具体工厂类的父类或者接口
- 具体工厂类:有多个具体的工厂类,每个工厂类创建不同的实例,而不是相当于简单工厂模式下的逻辑判断来实现。
- 客户类:创建工厂类,进而创建具体产品类的实例