工厂模式一种创建型设计模式,可以为创建提供最优解。工厂模式又可细分为三种(简单工厂模式
、工厂方法模式
和抽象工厂模式
)。
简单工厂模式
先看一个例子:
我们需要一辆自行车,自行车有很多种,可能时山地车、公路车或者普通自行车等等。
下面我们用简单工厂模式来实现这个获取一辆自行车的过程:
step 1 抽象类图:
image.png
step 2 代码实现(主要看工厂类):
package com.headfirst.factory;
public class BikeFactory {
/**
* @brief to produce a bike.
* @param type
* @return
*/
static Bike produceBike(int type) {
Bike bike;
switch (type) {
case 0: {/* produce a road bike. */
bike = new RoadBike();
}
case 1: {/* produce a mountain bike. */
bike = new MountainBike();
}
case 2: {/* produce a normal bike. */
bike = new NormalBike();
}
default:/* default */
bike = new NormalBike();
}
return bike;
}
}
// 使用工厂类创建自行车对象:
RoadBike roadBike = (RoadBike)BikeFactory.produceBike(0);
该实现的核心就是Bike produceBike(int type){}
,所有Bike
对象都通过Bike produceBike(int type){}
来创建,这就是简单工厂模式
。
工厂方法模式
简单工厂模式
不符合开闭原则
,所以实际很少使用。工厂方法模式
是对简单工厂模式
的优化。
还是上面的例子,我们修改一下设计,将工厂类细分,不在通过传参来区分创建对象的类型,使其尽量符合开闭原则
。
step 1 抽象类图:
image.png
step 2 代码实现:
package com.headfirst.factory;
public abstract class BikeFactory {
/**
* @brief to produce a bike.
* @param type
* @return
*/
abstract Bike produceBike(int type);
}
package com.headfirst.factory;
public class RoadBikeFactory extends BikeFactory {
@Override
Bike produceBike(void) {
// TODO Auto-generated method stub
return new RoadBike();
}
}
package com.headfirst.factory;
public class MountainBikeFactory extends BikeFactory {
@Override
Bike produceBike(void) {
// TODO Auto-generated method stub
return new MountainBike();
}
}
// 使用工厂类创建自行车对象:
RoadBike roadBike = (RoadBike)new RoadBikeFactory ().produceBike(0);
不同类型的自行使用不同的工厂类,这样不会频繁破坏工厂类的封装,这就是工厂方法模式
。
抽象工厂模式
抽象工厂模式
的定义是:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
也就是说,抽象工厂模式
和工厂方法模式
的区别是:
-
工厂方法模式
提供创建一个对象的接口 -
抽象工厂模式
提供创建一系列对象的接口