一、简单工厂模式
工厂类角色: 这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
抽象产品角色: 它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
具体产品角色: 工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
// 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
abstract class Car {
public abstract void drive();
}
class BmwCar extends Car {
@Override
public void drive() {
System.out.println("开始驾驶宝马汽车");
}
}
// 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
class AudiCar extends Car {
@Override
public void drive() {
System.out.println("开始驾驶奥迪汽车");
}
}
// 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
class CarFactory {
public static Car getCar(String name) {
if ("宝马".equals(name)) {
return new BmwCar();
} else if ("奥迪".equals(name)) {
return new AudiCar();
}else{
throw new RuntimeException("没有这种汽车");
}
}
}
public class Test {
public static void main(String[] args) {
Car car = CarFactory.getCar("奥迪");
car.drive();
}
}
分析: 实现简单,但是扩展的时候需要更改CarFactory类中的方法,扩展性不好
二、工厂方法模式
抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
具体工厂角色: 它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
抽象产品角色: 它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
具体产品角色: 具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
// 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
abstract class Car {
public abstract void drive();
}
// 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
class BmwCar extends Car {
@Override
public void drive() {
System.out.println("开始驾驶宝马汽车");
}
}
// 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
class AudiCar extends Car {
@Override
public void drive() {
System.out.println("开始驾驶奥迪汽车");
}
}
// 抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
abstract class CarFactory {
public abstract Car getCar();
}
// 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
class BmwCarFactory extends CarFactory {
@Override
public Car getCar() {
return new BmwCar();
}
}
// 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
class AudiCarFactory extends CarFactory {
@Override
public Car getCar() {
return new AudiCar();
}
}
public class Test {
public static void main(String[] args) {
CarFactory carFactory = new AudiCarFactory();
Car car = carFactory.getCar();
car.drive();
}
}
**分析:**虽然需要多些一个Car类的实现类和CarFactory类的实现类,但是扩展性还是可以的,不过太笼统,没有细分,毕竟宝马下面有运动系列、商务车等等
三、抽象工厂模式
注意:相当于 简单工厂模式 和 工厂方法模式 的组合模式
先来认识下什么是产品族:位于不同产品等级结构中,功能相关联的产品组成的家族。如果光看这句话就能清楚的理解这个概念,我不得不佩服你啊。还是让我们用一个例子来形象地说明一下吧。
图中的BmwCar和AudiCar就是两个产品树(产品层次结构);而如图所示的BmwSportsCar和AudiSportsCar就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar和AudiBussinessCar也是一个产品族。
回到抽象产品模式的话题上,可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。而且使用抽象工厂模式还要满足一下条件:
- 系统中有多个产品族,而系统一次只可能消费其中一族产品
- 同属于同一个产品族的产品以其使用。
来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):
抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
具体工厂角色: 它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
抽象产品角色: 它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
具体产品角色: 具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
// 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
abstract class Car {
public abstract void drive();
}
// 产品树
abstract class BmwCar extends Car {
}
// 产品树
abstract class AudiCar extends Car {
}
// 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。(产品族)
class BmwSportCar extends BmwCar {
@Override
public void drive() {
System.out.println("开始驾驶宝马运动汽车");
}
}
// 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。(产品族)
class BmwBusinessCar extends BmwCar {
@Override
public void drive() {
System.out.println("开始驾驶宝马商务汽车");
}
}
// 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。(产品族)
class AudiSportCar extends AudiCar {
@Override
public void drive() {
System.out.println("开始驾驶奥迪运动汽车");
}
}
// 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。(产品族)
class AudiBusinessCar extends AudiCar {
@Override
public void drive() {
System.out.println("开始驾驶奥迪商务汽车");
}
}
// 抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
abstract class CarFactory {
public abstract Car getCar(String type);
}
// 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
class BmwCarFactory extends CarFactory {
@Override
public Car getCar(String type) {
if ("运动".equals(type)) {
return new BmwSportCar();
} else if ("商务".equals(type)) {
return new BmwBusinessCar();
} else {
throw new RuntimeException("宝马没有该类型车");
}
}
}
// 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
class AudiCarFactory extends CarFactory {
@Override
public Car getCar(String type) {
if ("运动".equals(type)) {
return new AudiSportCar();
} else if ("商务".equals(type)) {
return new AudiBusinessCar();
} else {
throw new RuntimeException("奥迪没有该类型车");
}
}
}
public class Test {
public static void main(String[] args) throws Exception {
CarFactory carFactory = new AudiCarFactory();
Car car = carFactory.getCar("商务");
car.drive();
}
}
分析: 相当于 简单工厂模式 和 工厂方法模式 的组合模式,可以深入到细分领域,想要什么车型就创建什么车型