设计模式-工厂模式

工厂方法模式适合于对实现了同一接口或继承了同一父类的一些类进行实例的创建。一般是通过定义一个工厂类,并在其方法中实现对具有上述特点的类对象的创建。

根据具体产生类对象的方法定义形式,又可以将其分为普通工厂方法模式、多个工厂方法模式和静态工厂方法模式。

利用继承和多态实现工厂模式,提高代码的复用度。

目的:

适用场景:

一、普通工厂方法模式:

常见的经典写法如下(以发送邮件和短信为例):

1.定义邮件类和短信类具有的共同接口:定义邮件类和短信类:定义工厂类:测试生成MailSender和SmsSender对象:

interface Sender{public void sender();}

class MailSender implements Sender{@Override

public void send() {System.out.println("发送邮件");}}

class SmsSender implements Sender{@Override

public void send() {System.out.println("发送短信");}}

class SenderFactory {

public Sender produce(String type) {

if (type.equals("mail")) {return new MailSender();}

else if (type.equals("sms")) {return new SmsSender();}

else {return null;}}}

public class FactoryMethodTest {

public static void main(String[] args) {

SenderFactory factory = new SenderFactory();

Sender mailSender = factory.produce("mail");

Sender smsSender = factory.produce("sms");}}

多个工厂方法模式:

将普通工厂模式中的工厂类中创建类的方法从依赖于参数判断改为直接针对每种对象各自定义一个生产方法。

class SenderFactory {public Sender produceMail(){return new MailSender();}

public Sender produceSms(){return new SmsSender();}}

静态工厂方法模式:

静态工厂方法模式与前面两种具体的方法定义不同在于方法被定义成静态的,这样可以不通过创建工厂实例就能直接获取到目标类的对象。

class SenderFactory {public static Sender produceMail(){return new MailSender();}

public static Sender produceSms(){return new SmsSender();}}


通过一个公用的类对其他具有相同特性(实现相同接口或继承同一父类)的类的对象进行创建。随之带来的问题在于:当新定义了一个具有相同特性的类时,需要修改工厂类。这与设计模式中的开闭原则有些违背。因此,通过抽象工厂模式:创建多个工厂类而不是一个工厂类,一旦需要创建新的类对象,只需增加新的工厂类就可以了,不需要修改之前的代码。如此可以较好解决工厂方法模式中的问题。

常见经典写法如下(以发送邮件和短信为例):

1. 定义邮件类和短信类具有的共同接口:

与工厂方法模式中定义相同。

2.定义邮件类和短信类:

与工厂方法模式中定义相同。

3.定义不同工厂类所具有的共同接口(既然在需要的时候可以直接创建新的工厂类,那么这些工厂类应该是具有相同的接口的):

http://www.cnblogs.com/lwbqqyumidi/p/3746483.html

interfaceProvider {23publicSender produce();4}

classMailFactoryimplementsProvider {23@Override4publicSender produce() {5returnnewMailSender();6}78}

classSmsFactoryimplementsProvider {23@Override4publicSender produce() {5returnnewSmsSender();6}78}

publicclassClient {23publicstaticvoidmain(String[] args) {4Provider provider =newMailFactory();5Sender sender =provider.produce();6sender.send();7}89}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,173评论 19 139
  • 在java中,通常使用new操作符创建对象的实例。但是在一些情况下,new操作符直接生成对象会带来一些问题,例如:...
    步积阅读 988评论 2 3
  • 工厂模式 概述:工厂方法中抽象工厂负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的具体类实现。 优点:客...
    JerichoPH阅读 226评论 0 0
  • 世上飘花如残雪,落得一地烂漫,却无多少人去欣赏,留下的只是雪上残印。 寒冷的天,使人们的脸上多了那天然的红晕,这就...
    绍佳阅读 319评论 0 0

友情链接更多精彩内容