23种设计模式之——工厂方法模式

工厂方法模式

       上一篇文章中说到了简单工厂方法模式中存在的诸多缺点,为了克服简单工厂模式不符合开发原则的缺点(即是每次增加一个新产品加入到产品类时,工厂方法就要增加适当的条件语句,以便能够在客户需要时创建新增加的类的实例),在简单工厂方法模式的基础上进行了进一步的改进,即把原来简单工厂方法中单一的工厂类改写为一个层次来,来解决问题,即是本文中的工厂方法模式。

工厂方法模式的类图如下所示:



       在工厂方法模式的类图中,每个产品类对于一个工厂类,而工厂类只负责创建相应产品类的对象,工厂类CreatorA只负责创建类ProductA的对象,工厂类CreatorB只负责创建类ProductB的对象,从而在新增加一个产品类(例如:ProductC)只需要再创建对应的工厂类(例如:CreatorC)的对象,这样就更好的实现与接口分离,这样就符合了开闭原则。

下面结合一个例子来说明工厂方法模式:

       假如你要去买一个保险,保险人员跟你说:按照责任的分类我们分为三种保险:1、人寿保险(Life Insurance);2、人身意外伤害保险(Personal accident injury insurance);3、健康保险(Health insurance)。接着保险人员向你解释了每一种保险的具体细则,然后你说你要买人身意外伤害保险,好,保险人员马上帮你办理相关业务。以下为整个过程的类图:


首先是AutoInsurance接口,该接口只定义了一个方法,用来显示保险的信息。

public interface AutoInsurance {

	// 用于获取保险信息
	public String getInfo();
}

其实是它的三个具体实现类,首先是人寿保险类。

public class LifeInsurance implements AutoInsurance {

	@Override
	public String getInfo() {
		String insurInfo = "你买了人寿保险";
		return insurInfo;
	}
}
接着是人身意外伤害保险类。

public class PersonalAccidentInsurance implements AutoInsurance {

	@Override
	public String getInfo() {
		String insurInfo = "你买了人身意外伤害保险";
		return insurInfo;
	}
}

最后是健康保险类。

public class HealthInsurance implements AutoInsurance {

	@Override
	public String getInfo() {
		String insurInfo = "你买了健康保险";
		return insurInfo;
	}
}
接下来是工厂类接口,也就是和简单工厂方法模式区分的重要的一个类。

public interface PolicyFactory {

	//返回一个保险类接口,客户不必知道具体的细则
	public AutoInsurance getInsurObj();
}

接下来是实现它的三个具体类,首先是创建人寿保险的类。

public class LifePolicy implements PolicyFactory {

	@Override
	public AutoInsurance getInsurObj() {
		return new LifeInsurance();
	}
}
接着是创建人身意外伤害保险的工厂类。

public class PersonPolicy implements PolicyFactory {

	@Override
	public AutoInsurance getInsurObj() {
		return new PersonalAccidentInsurance();
	}
}
最后是创建健康保险的工厂类。

public class HealthPolicy implements PolicyFactory {

	@Override
	public AutoInsurance getInsurObj() {
		return new HealthInsurance();
	}
}
接下来就是我们的客户端类。

public class Client {

	public static void main(String[] args) {

		//客户说买一个人身意外伤害保险,好,工厂类创建一个
		PolicyFactory pf = new PersonPolicy();
		//工厂创建了具体的保险类对象
		AutoInsurance ai = pf.getInsurObj();
		//给出相应的提示信息
		System.out.println(ai.getInfo());
	}
}

       简答工厂方法模式和工厂方法模式都是返回一个父类对象,客户不必知道返回对象的具体类型,客户要的是具体的结果。

我们来比较一下两个模式的不同点:

1、模式的中心不同。简单工厂方法模式的核心是一个具体的工厂类,而工厂方法的核心是一个抽象类或者接口。

2、简单工厂方法模式不支持开发原则,而且工厂方法是静态的,而工厂方法模式定义的是一个接口或者抽象类,并且符合开闭原则,即是当增加一个产品时,即在工厂类的层次结构中增加相应的新产品的对应类,不必修改客户端的代码(当然如果你需要才添加),也不需要修改和编译抽象的工程类和保险类以及具体存在的其他实现类(在本文中即是如果保险类别又多了一个,假如增加一个财产保险(property insurance),也只需要在对应的保险接口实现它和工厂方法接口中实现即可),这样就很好的符合了开闭原则。

3、工厂方法模式较简单工厂方法模式不用写条件判断的分支语句了,这样有利于以后更好的扩展和维护。

工厂方法模式具有如下优点:

1、工厂方法具有开发原则。

2、不用再写过多的分支选择语句。

何种情况下使用工厂方法模式:

1、一个类使用它的子类决定所要创建的对象。

2、当创建一个类的对象逻辑比较复杂时,并且具有多个分支选择语句,可考虑用工厂方法模式。

3、一个类不能预先准确知道它要创建层次类的哪个具体对象。










  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值