java设计模式之工厂模式(Factory)

原创 2019-08-27 10:10:43 设计模式 阅读(202)

简介 工厂模式有简单工厂模式、工厂方法模式和抽象工厂模式,利用Factory统一创建所需的实例。

一、简单工厂

就是建立一个工厂类,对实现了同一个接口的一些类进行实例的创建。
举例:发送邮件和短信
它们共同的接口:

public interface Sender { void sendMsg(); }

分别创建邮件和短信的实现类

public class MailSender implements Sender { @Override public void sendMsg() { System.out.println("发送邮件方法。。。"); } }
public class SmsSender implements Sender { @Override public void sendMsg() { System.out.println("发送短信方法。。。"); } }

最后创建工厂类

public class SendFactory { /** * 生产发送短信的实例 */ public static Sender produceSms(){ return new SmsSender(); } /** * 生产发送邮件的实例 */ public static Sender produceMail(){ return new MailSender(); } }

这样创建短信或邮件的实例可以直接使用工厂类提供的静态方法即可创建实例了

//发送邮件 SendFactory.produceMail().sendMsg(); //发送短信 SendFactory.produceSms().sendMsg();

总体来说,简单工厂适合:凡是出现了大量的产品需要创建,并且具有共同接口时,通过工厂模式创建。

二、工厂方法模式

简单工厂有个问题,类的创建依赖工厂类,也就是说,如果想扩展程序,必须对工厂类进行修改,这违背了闭包原则;
这时需要工厂方法模式解决此问题:创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功能,直接增加新的工厂类即可,无需修改之前的代码
此方法好处是增加功能不需要修改以前的代码,只需要增加相关的实现类和工厂类即可,扩展性较好。
工厂接口:

public interface Provider{ Sender produce(); }

利用工厂实现类针对不同的产品实现即可

三、抽象工厂方法

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类;
抽象工厂和工厂方法不好分清楚:

  • 工厂方法模式:一个抽象产品类,派生出多个具体产品类;一个抽象工厂类,派生出多个具体工厂类;每个具体工厂类只能创建一个具体产品类的实例
  • 抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类;一个抽象工厂类,可以派生出多个具体工厂类;每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线的多个产品。

区别

  1. 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
  2. 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂可以创建多个。
  3. 工厂方法创建“一种”产品,它的着重点在于怎么创建,在开发中,大量代码可能围绕着这种产品的构造,初始化这些细节上面。所以,类似的产品之间有很多可以复用的特征,常和模板方法相随
  4. 抽象工厂需要创建一系列产品,着重点在于创建哪些产品上,在开发中,主要任务是划分不同差异的产品线,并尽量保持每条产品线接口一致,从而可以从同一个抽象工厂继承。

例子:工厂可以生产鼠标和键盘。那么抽象工厂的实现类的对象都可以生产鼠标和键盘,区别是工厂A生产的是罗技的键盘和鼠标,工厂B生产的是微软的。
这样的A和B就是工厂,对应抽象工厂;
而每个工厂生产的鼠标和键盘就是产品,对应工厂方法;
用工厂方法模式,如果需要替换键盘,需要替换生产键盘的工厂方法,才可以把键盘从罗技换到微软。但是用了抽象工厂模式,只需要换家工厂,就可以同时鼠标和键盘一套。如果产品有几十个,当然使用抽象工厂模式一次替换全部最方便。

所以说:抽象工厂就像工厂,而工厂方法就像是工厂的一种产品生产线。