一 简单工厂模式
在说工厂方法模式之前,先看看简单工厂模式。简单工厂模式分为三种。
1)普通
就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:
下面举一个发短信和邮箱的例子:
Sender.java
package com.lxj.simplefactory; public interface Sender { public void send(); }
MailSender.java
package com.lxj.simplefactory; public class MailSender implements Sender { @Override public void send() { System.out.println("MailSender.....send"); } }
SmsSender.java
package com.lxj.simplefactory; public class SmsSender implements Sender { @Override public void send() { System.out.println("SmsSender.......send"); } }
SendFactory.java
package com.lxj.simplefactory; public class SendFactory { public Sender produce(String type){ //不同的类型获取不同的实例 if("mail".equals(type)) { return new MailSender(); }else if("sms".equals(type)) { return new SmsSender(); }else { System.out.println("输入类型错误,无法创建实例对象。"); return null; } } }
TestSimpleFactoryMethod.java
package com.lxj.simplefactory; public class TestSimpleFactoryMethod { public static void main(String[] args) { SendFactory sendFactory = new SendFactory(); //获取发送邮箱实例 Sender mailSender = sendFactory.produce("mail"); mailSender.send(); //获取发送短信实例 Sender smsSender = sendFactory.produce("sms"); smsSender.send(); } }
测试结果:
MailSender.....send SmsSender.......send
2)多个方法
是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正 确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:
SendFactory.java
package com.lxj.simplefactory; public class SendFactory { public Sender produceMail() { return new MailSender(); } public Sender produceSms() { return new SmsSender(); } }
Test.java
package com.lxj.simplefactory; public class Test { public static void main(String[] args) { SendFactory sendFactory = new SendFactory(); Sender produceMail = sendFactory.produceMail(); produceMail.send(); } }
运行结果:
MailSender.....send
3)多个静态方法
将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。
SendFactory.java
package com.lxj.simplefactory; public class SendFactory { public static Sender produceMail() { return new MailSender(); } public static Sender produceSms() { return new SmsSender(); } }
Test.java
package com.lxj.simplefactory; public class Test { public static void main(String[] args) { Sender produceMail = SendFactory.produceMail(); produceMail.send(); } }
4)总结
从前面的简单工厂模式中,可以知道凡是需要创建大量对象,并且具有共同的接口时,可以通过工厂模式来创建,在上面的三种模式中,普通工厂模式方法中,传入的字符串可能会出现错误,多个静态方法相比多个方法不用创建实例化对象。所以,大多数情况下,我们会使用多个静态工厂方法模式。
二 工厂方法模式
简单工厂模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须 对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决? 就用到工厂方法模式,创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功 能,直接增加新的工厂类就可以了,不需要修改之前的代码。
Provider.java
package com.lxj.simplefactory; public interface Provider { public Sender produce(); }
MailSenderFactory.java
package com.lxj.simplefactory; public class MailSenderFactory implements Provider{ @Override public Sender produce() { return new MailSender(); } }
SmsSenderFactory.java
package com.lxj.simplefactory; public class SmsSenderFactory implements Provider { @Override public Sender produce() { return new SmsSender(); } }
Sender.java
package com.lxj.simplefactory; public interface Sender { public void send(); }
SmsSender.java
package com.lxj.simplefactory; public class SmsSender implements Sender { @Override public void send() { System.out.println("SmsSender.......send"); } }
MailSender.java
package com.lxj.simplefactory; public class MailSender implements Sender { @Override public void send() { System.out.println("MailSender.....send"); } }
TestFactoryMethod.java
package com.lxj.simplefactory; public class TestFactoryMethod { public static void main(String[] args) { //创建不同实例使用不用的工厂方法,实现Provider接口即可 MailSenderFactory mailSenderFactory = new MailSenderFactory(); Sender mailSender = mailSenderFactory.produce(); mailSender.send(); } }
运行结果:
MailSender.....send
通过这个例子,如果想要扩展一个发彩信的功能,只需要重新创建一个类实现Sender接口,然后需要对应的工厂类,实现Provider接口,就可以了,无需改变以前的代码,这样扩展性能好。
共同学习,写下你的评论
评论加载中...
作者其他优质文章