概念定义:
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,
达到提高灵活性的目的
工厂模式分为三种:简单工厂,工厂方法和抽象工厂.
简单工厂:
组成:
由三种角色组成,分别为工厂类角色、抽象产品角色、具体产品角色
实例实现:
抽象产品角色:
package factory.simpleFactory;
publicinterface Car {
publicvoid drive();
}
具体产品角色1:
package factory.simpleFactory;
publicclass Benz implements Car{
@Override
publicvoid drive() {
System.out.println("Driving Benz");
}
}
具体产品角色2:
package factory.simpleFactory;
publicclass Bmw implements Car{
@Override
publicvoid drive() {
System.out.println("Driving Bmw");
}
}
工厂类角色:
package factory.simpleFactory;
publicclass DriveFactory {
publicstatic Car driveCar(String carName) {
if (carName.equals("Benz")) {
returnnew Benz();
}
if (carName.equals("Bmw")) {
returnnew Bmw();
}
returnnull;
}
}
测试类:
package factory.simpleFactory;
publicclass Test {
publicstaticvoid main(String[] args) {
Car car = DriveFactory.driveCar("Benz");
car.drive();
car = DriveFactory.driveCar("Bmw");
car.drive();
}
}
结果:
Driving Benz
Driving Bmw
总结:从开闭原则(对扩展开放,对修改关闭)来分析简单工厂模式,当新增产品时,只要符合Car接口就可以,但是工厂类的代码却要修改,这明显违背开闭原则,并且这只是最简单的情况,工厂类只应对一个层次的具体类,如果是多层次呢?这时就需要用到方法工厂模式。
工厂方法:
工厂方法与简单工厂相比,多了一个工厂抽象角色,这样可以有多个工厂生产产品,需要哪一个只要指定工厂就行,工厂方面也符合开闭原则。
抽象工厂角色:
package factory.methodFactory;
import factory.simpleFactory.Car;
publicinterface Drive {
public Car driveCar();
}
具体工厂角色1:
package factory.methodFactory;
import factory.simpleFactory.Bmw;
import factory.simpleFactory.Car;
publicclass BmwDrive implements Drive{
@Override
public Car driveCar() {
returnnew Bmw();
}
}
具体工厂角色2:
package factory.methodFactory;
import factory.simpleFactory.Benz;
import factory.simpleFactory.Car;
publicclass BenzDrive implements Drive{
@Override
public Car driveCar() {
returnnew Benz();
}
}
测试类:
package factory.methodFactory;
import factory.simpleFactory.Car;
publicclass Test {
publicstaticvoid main(String[] args) {
Drive drive = new BenzDrive();
Car car = drive.driveCar();
car.drive();
}
}
测试结果:
Driving Bmw
总结:
工厂方法模式中,要么将判断逻辑留在抽象工厂角色中,要么在客户程序中将具体工厂角色写死(就象上面的例子一样)。并且产品对象创建条件的改变必然会引起工厂角色的修改。下面的情况可以考虑用工厂方法模式:
1) 当客户程序不需要知道要使用对象的创建过程。
2) 客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象
抽象工厂:
先来认识下什么是产品族: 位于不同产品等级结构中,功能相关联的产品组成的家族。
图中的BmwCar 和BenzCar 就是两个产品树(产品层次结构);而如图所示的BenzSportsCar 和BmwSportsCar 就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar 和BenzBussinessCar 也是一个产品族。
抽象工厂模式和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且
抽象工厂模式是三个里面最为抽象、最具一般性的。
抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象
而且使用抽象工厂模式还要满足以下条件:
1) 系统中有多个产品族,而系统一次只可能消费其中一族产品。
2) 同属于同一个产品族的产品以其使用。
来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):
1) 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须
实现的接口或者必须继承的父类。在java 中它由抽象类或者接口来实现。
2) 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体
产品的对象。在java 中它由具体的类来实现。
3) 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在 java 中一般有抽象类
或者接口来实现。
4) 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在 java 中由具体的类
来实现。
这里代码不再写了,大概说一下:
抽象工厂角色: 接口CarFactory 方法有driveCar ()
具体工厂角色: 类1 SportCarFactory,根据参数返回BenzSprotCar 或者BmwSportCar
类2:BussinessCarFactory 根据参数返回BenzBussinessCar或者BmwBussinessCar.
抽象产品角色: 接口SprotCar, BussinessCar
具体产品角色:类BenzSprotCar, BmwSportCar, BenzBussinessCar, BmwBussinessCar