1.定义
1.工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式,让类的实例化推迟到子类中进行,属于创建型模式
2.作用
- 降低程序之间的耦合度
- 提高扩展性,降低修改量
3.案例
以生产汽车为例,定义一个ICar接口,汽车都有发动机(Engine),和品牌(brand)提供这两个方法,再定义两个实现类宝马和奥迪,分别对接口提供的两个方法做不同的实现,代码如下
public interface ICar {
//发动机
void Engine();
//品牌
void brand();
}
public class BMW implements ICar{
@Override
public void engine() {
System.out.println("宝马的发动机");
}
@Override
public void brand() {
System.out.println("宝马的品牌");
}
}
public class Audi implements ICar {
@Override
public void engine() {
System.out.println("奧迪的发动机");
}
@Override
public void brand() {
System.out.println("奧迪的品牌");
}
}
接下来定义一个汽车工厂来创建的汽车,汽车工厂有一个create方法根据方法的参数创建汽车,其参数是ICar的实现类,代码如下:
//汽车工厂
public class CarFactory {
//生产汽车
public T create(Class c){
ICar car = null;
try {
//根据类名new一个类
car = (ICar) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) car;
}
}
OK!简单的工厂模式就实现完毕,让我们开始生产汽车吧~
public static void main(String[] args) {
//new 一个工厂
CarFactory factory = new CarFactory();
//生产宝马
ICar car= factory.create(BMW.class);
car.brand();
car.engine();
//生产奥迪
ICar car2= factory.create(Audi.class);
car2.brand();
car2.engine();
}
运行一波看看结果:
宝马的品牌
宝马的发动机
奧迪的品牌
奧迪的发动机
再分析一下实现过程:第一步把汽车的共性放到了ICar接口,第二步创建实现类,做不同的实现。第三步写一个工厂类里面有一个create方法,通过调用这个方法生产不同的汽车。实际上工厂模式在项目开发中的使用频率是非常高的,再说一个升级版本多个工厂类,在做一些复杂的项目中,经常会被用到
多个工厂类的抽象工厂,把工厂类的Create方法放到一个抽象类中,不同的工厂做不同的实现,
public interface BaseCarFactory {
ICar create();
}
奥迪汽车工厂创建奥迪汽车
//奥迪汽车工厂
public class AudiCarFactory implements BaseCarFactory {
@Override
public ICar create() {
return new Audi();
}
}
宝马汽车工厂创建宝马汽车
//宝马汽车工厂
public class BMWCarFactory implements BaseCarFactory {
@Override
public ICar create() {
return new BMW();
}
}
Audi和BMW两个类不变,Main函数修改如下,直接用具体的工厂,实例化具体的类
public static void main(String[] args) {
//new 一个奥迪汽车工厂,实例化奥迪
ICar car = new AudiCarFactory().create();
car.brand();
car.Engine();
ICar car2 = new BMWCarFactory().create();
car2.brand();
car2.Engine();
}
打印结果和以前一样
奧迪的品牌
奧迪的发动机
宝马的品牌
宝马的发动机
多工厂模式可使结构更加的清晰,更易于实现特定的需求,适合在比较复杂的项目逻辑中使用,但又给扩展性带来了影响,因为如果你要扩展某各实现类,就需要修改相应的工厂类,
4.总结
工厂方法模式将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时,当类将创建对象的职责委托给多个帮助子类中的某一个,可以使用工厂方法。