工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
工厂模式又分为:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
一、简单工厂模式
这里以奥迪4S店卖汽车为例。
简单工厂模式又称静态工厂模式。
实现组成:
- 工厂类角色(SSSSFactroy.java):负责产生具体产品角色实例。由一个具体类实现。
- 抽象产品角色(Car.java):是具体产品继承的父类或者实现的接口,抽象出具体产品共同的属性或方法。由接口或者抽象类来实现。
- 具体产品角色(AudiRS3.java;AudiRS5.java;AudiRS7.java):工厂类所创建的对象就是这些具体产品角色的实例。由一个或多个具体类实现。
看完下面的代码再来看这三个角色会比较清晰。
1、4S店卖各种各样的汽车,抽象出汽车的共有属性--------抽象产品角色
Car.java
package mistra.com.designpatterns.Factory;
/**
* Created by Mistra-WR on 2018/1/18/018.
*/
public abstract class Car {
protected String name;//型号名称
/**
* 加速功能
*/
public void speedUp()
{
System.out.println(name + "----加速----");
}
/**
* 刹车功能
*/
public void brake()
{
System.out.println(name + "----刹车----");
}
}
2、各种型号的汽车的具体类--------具体产品角色
AudiRS3.java
package mistra.com.designpatterns.Factory;
/**
* Created by Mistra-WR on 2018/1/18/018.
*/
public class AudiRS3 extends Car {
public AudiRS3(){
this.name = "奥迪RS3";
}
}
AudiRS5.java
package mistra.com.designpatterns.Factory;
/**
* Created by Mistra-WR on 2018/1/18/018.
*/
public class AudiRS5 extends Car{
public AudiRS5(){
this.name = "奥迪RS5";
}
}
AudiRS7.java
package mistra.com.designpatterns.Factory;
/**
* Created by Mistra-WR on 2018/1/18/018.
*/
public class AudiRS7 extends Car{
public AudiRS7(){
this.name = "奥迪RS7";
}
}
3、取得汽车的工厂类--------工厂类角色
SSSSFactroy .java
package mistra.com.designpatterns.Factory;
/**
* Created by Mistra-WR on 2018/1/18/018.
*/
/**
* 4s店仓库管理员,给其汽车型号就能得到对应的汽车
*/
public class SSSSFactroy {
public Car SalesManagerGetCar(String type){
Car car = null;
switch (type){
case "RS3": car = new AudiRS3();
case "RS5": car = new AudiRS5();
case "RS7": car = new AudiRS7();
default:;
}
return car;
}
}
调用:
**HandOverCar **
package mistra.com.designpatterns.Factory;
/**
* Created by Mistra-WR on 2018/1/18/018.
*/
public class HandOverCar {
private SSSSFactroy sf;
public HandOverCar(SSSSFactroy sf){
this.sf = sf;
}
public Car GiveCar(String type){
Car car = sf.SalesManagerGetCar(type);
car.speedUp();
car.brake();
return car;
}
}
二、工厂方法模式
工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。
实现组成:
- 抽象工厂角色(HandOverCarAbstract .java): 具体工厂角色必须实现的接口或者必须继承的父类。由抽象类或者接口来实现。
- 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品角色的对象。有多个
- 抽象产品角色(Car.java):是具体产品继承的父类或者实现的接口,抽象出具体产品共同的属性或方法。由接口或者抽象类来实现。
- 具体产品角色(AudiRS3.java;AudiRS5.java;AudiRS7.java;AudiA7.java):工厂类所创建的对象就是这些具体产品角色的实例。由一个或多个具体类实现。
抽象产品角色类Car.java和具体产品角色类就不列出来了。
1、抽象工厂角色----核心
HandOverCarAbstract .java
package mistra.com.designpatterns.Factory;
/**
* Created by Mistra-WR on 2018/1/21/021.
*/
public abstract class HandOverCarAbstract {
public abstract Car SalesManagerGetCar(String type);
public Car GiveCar(String type){
Car car = SalesManagerGetCar(type);
car.speedUp();
car.brake();
return car;
}
}
2、具体工厂角色----有多个
不同的具体工厂类可以生成自己特有的产品,这就增加了灵活性。
Factory1.java
package mistra.com.designpatterns.Factory;
/**
* Created by Mistra-WR on 2018/1/21/021.
*/
public class Factory1 extends HandOverCarAbstract{
@Override
public Car SalesManagerGetCar(String type) {
Car car = null;
switch (type){
case "RS3": car = new AudiRS3();
case "RS5": car = new AudiRS5();
case "RS7": car = new AudiRS7();
default:;
}
return car;
}
}
Factory2.java
package mistra.com.designpatterns.Factory;
/**
* Created by Mistra-WR on 2018/1/21/021.
*/
public class Factory2 extends HandOverCarAbstract{
@Override
public Car SalesManagerGetCar(String type) {
Car car = null;
switch (type){
case "RS3": car = new AudiRS3();
case "RS5": car = new AudiRS5();
case "RS7": car = new AudiRS7();
case "A7": car = new AudiA7();
default:;
}
return car;
}
}
可以看出工厂方法的加入,使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。如果不能避免这种情况,可以考虑使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。
**工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式, 把核心放在一个实类上。工厂方法模式可以允许很多工厂类从抽象工厂类继承下来, 从而可以在实际上成为多个简单工厂模式的综合,从而推广了简单工厂模式。 **
三、抽象工厂模式
这篇博文写的挺详细的:JAVA设计模式之抽象工厂模式
工厂设计模式的最终目的都是为了解耦。
简单工厂模式是由一个具体的类去创建具体产品角色类的实例,父类是相同的,父类是具体的。
工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体产品角色的对象,这样做的目的是将类的实例化操作延迟到子类中完成。
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。