可复用面向对象软件基础——设计模式(二)之工厂方法模式
2016-12-15 12:57
567 查看
一、工厂方法模式分类(3种)
普通工厂模式多个工厂方法模式
静态工厂方法模式
二、工厂方法模式详解
(1)普通工厂模式
普通工厂模式就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。// 1、创建不同产品的共同接口 public interface Sender { /** * 邮寄接口中有一个邮寄方法待实现 */ public void Send(); }
/** * 2、(实现类)邮件邮寄类实现了邮寄接口,实现其邮寄的抽象方法 * @author barnett * */ public class MailSender implements Sender { @Override public void Send() { System.out.println("I am MailSender!"); } }
/** * 短信邮寄类实现了邮寄接口,实现其邮寄的抽象方法 * @author barnett * */ public class SmsSender implements Sender { @Override public void Send() { System.out.println("I am SmsSender!"); } }
/** * 3、工厂类,负责多次制造产品(new出复用的类) * @author barnett * */ public class SendFactory { /** * 工厂类中的生产方法 * @param type 输入要生产的产品类型 * @return 返回一个产品 */ 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; } } }
/** * 4、测试类,实例一个工厂,生产多个产品 * @author barnett * */ public class FactoryTest { public static void main(String[] args) { // 创建一个工厂(可多次生产) SendFactory factory = new SendFactory(); // 使用工厂按照要求生产相应产品 Sender sender = factory.produce("sms"); // 调用产品的方法 sender.Send(); Sender sender2 = factory.produce("mail"); sender2.Send(); } }
工厂优势
1、 实例出一个工厂,再生产工厂内可以生产的产品,则只需要调用工厂的生产方法,通过传入不同的参数,生产不同的产品2、传统方式则每次要生产一个产品时都需要实例化,然后调用生产方法
3、这样一来,要生产产品时,无需了解内部细节,交由工厂管理,节省资源
(2)多个工厂方法模式
多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象而多个工厂方法模式是提供多个工厂方法,分别创建对象。
/** * 工厂类,负责多次制造产品 * @author barnett * */ public class MultiMethodSendFactory { /** * 专门生产邮件邮寄器的方法 * @return */ public Sender produceMail() { return new MailSender(); } /** * 专门生产短信邮寄器的方法 * @return */ public Sender produceSms() { return new SmsSender(); } }
/** * 测试类,实例一个工厂,生产多个产品 * @author barnett * */ public class MultiMethodFactoryTest { public static void main(String[] args) { // 创建一个工厂(可多次生产) MultiMethodSendFactory factory = new MultiMethodSendFactory(); // 根据不同的需求调用不同的方法 Sender mailSender = factory.produceMail(); mailSender.Send(); Sender smsSender = factory.produceSms(); smsSender.Send(); } }
(3)静态工厂方法模式
将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。/** * 工厂类,负责多次制造产品 * @author barnett * */ public class StaticMethodSendFactory { /** * 专门生产邮件邮寄器的方法 * @return */ public static Sender produceMail() { return new MailSender(); } /** * 专门生产短信邮寄器的方法 * @return */ public static Sender produceSms() { return new SmsSender(); } }
/** * 测试类,直接调用工厂中的静态方法,生产产品 * @author barnett * */ public class StaticMethodFactoryTest { public static void main(String[] args) { Sender mailSender = StaticMethodSendFactory.produceMail(); mailSender.Send(); Sender smsSender = StaticMethodSendFactory.produceSms(); smsSender.Send(); } }
相关文章推荐
- 可复用面向对象软件基础——设计模式(一)之总览
- 迭代器模式--《设计模式-可复用面向对象软件的基础》Erich Gamma
- 可复用面向对象软件基础——设计模式(五)之建造者模式
- 设计模式 可复用面向对象软件的基础(概念你认识多少)
- 可复用面向对象软件基础——设计模式(六)之原型模式
- 设计模式(Design Patterns——可复用面向对象软件的基础
- 设计模式--可复用面向对象软件的基础(双语版)(十五周年·限量纪念版)
- 可复用面向对象软件基础——设计模式(四)之单例模式
- 设计模式(Design Patterns)-可复用面向对象软件的基础 08:外观模式(Facade)
- 设计模式(Design Patterns)-可复用面向对象软件的基础 05:原型模式(Prototype)和Java中的深、浅拷贝
- Design Patterns(设计模式 可复用面向对象软件的基础)
- <<设计模式-可复用面向对象软件的基础>>读书笔记
- 设计模式(Design Patterns)-可复用面向对象软件的基础 07:装饰模式(Decorator)
- 设计模式-可复用面向对象软件的基础 [读书笔记]
- 第二章 实例研究:设计一个文档编辑器--《设计模式-可复用面向对象软件的基础》Erich Gamma
- 可复用面向对象软件基础——设计模式(三)之抽象工厂模式
- 设计模式(Design Patterns)-可复用面向对象软件的基础 01:简介(Abstract)
- 借书20041102_《设计模式:可复用的面向对象软件的基础》《微软项目:求生法则》
- 学习:设计模式 可复用面向对象软件的基础 【引言】
- 第一章 引言--《设计模式-可复用面向对象软件的基础》Erich Gamma