一、工厂模式
工厂模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类。
简单工厂模式好处:工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态地实例化相关的类,对于客户端而言,去除了与具体产品的依赖。例如,利用简单工厂模式来实现计算器,运算工厂根据不同的运算要求动态返回具体的运算类。
简单工厂模式缺陷:一旦需要增加新的运算类,就必须修改运算工厂的逻辑,违反了开放-封闭原则。
工厂模式可以解决简单工厂模式的缺陷,通过对每个具体对象都创建一个具体工厂。但是工厂模式实现时,客户端需要决定实例化哪一个工厂来实现,选择判断的问题还是存在,只是工厂方法把简单工厂的内部逻辑移到了客户端代码来进行。缺点是每增加一个产品,就需要增加一个产品工厂的类,增加了额外的开发量。
二、UML类图
每一个具体的产品,都对应一个生成该产品的工厂。
三、具体案例
参考大话设计模式-雷锋工厂,雷锋工厂为创建雷锋对象的接口,具体的雷锋工厂类有大学生雷锋工厂、社区志愿者工厂等,封装了对应雷锋对象的创建。
public class FactoryDesign {
public static void main(String[] args) {
//每次不同对象的创建,只需修改这一行
IFactory factory=new UndergraduateFactory();
Leifeng leifeng=factory.createLeifeng();
leifeng.sweep();
leifeng.wash();
}
}
//雷锋类
class Leifeng{
public void sweep(){
System.out.println("扫地");
}
public void wash(){
System.out.println("洗碗");
}
}
//大学生雷锋类
class Undergraduate extends Leifeng{
}
//社区志愿者雷锋类
class Volunteer extends Leifeng{
}
//工厂类接口
interface IFactory{
Leifeng createLeifeng();
}
//创建大学生雷锋
class UndergraduateFactory implements IFactory{
@Override
public Leifeng createLeifeng() {
return new Undergraduate();
}
}
//创建社区志愿者雷锋
class VolunteerFactory implements IFactory{
@Override
public Leifeng createLeifeng() {
return new Volunteer();
}
}
实现结果:
扫地
洗碗
|
参考:大话设计模式