创建型模式----抽象工厂模式
来源:互联网 发布:itsm开源软件 编辑:程序博客网 时间:2024/05/15 00:03
1、抽象工厂模式
简单工厂模式存在的问题:
类实例的创建依赖工厂类,也就是说,如果想拓展程序,必须对工厂类进行修改,这违背了闭包原则。
那如何解决呢??
通过抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
关键点是:通过抽象工厂类创建多个工厂类。(产品通过工厂类来生成,而生成产品的对应的工厂类通过抽象类来生成:一个工厂类对应一种具体的产品)
实例一:
产品类
public interface Sender {public void send();}public class MailSender implements Sender {@Overridepublic void send() {System.out.println(" ~~~ MailSender ~~~~");}}public class SmsSender implements Sender {@Overridepublic void send() {System.out.println(" ~~~~ SmsSender ~~~");}}
定义抽象工厂,以及根据产品创建的对应的工厂类
public interface AbstractFactory {public Sender producter();}public class MailSenderFactory implements AbstractFactory {@Overridepublic Sender producter() {return new MailSender();}}public class SmsSenderFactory implements AbstractFactory {@Overridepublic Sender producter() {return new SmsSender();}}
模拟使用:
public static void main(final String[] args) {final AbstractFactory factory = new MailSenderFactory();factory.producter().send();final AbstractFactory factory2 = new SmsSenderFactory();factory2.producter().send();}
如果此时需要拓展一个发送word文档的类,则不必修改已有代码,直接对其进行新增对应的工厂即可
// 新增的工作簿发送产品public class WordSender implements Sender {@Overridepublic void send() {System.out.println(" ~~~~ WordSender ~~~~");}}// 新增对应的创建工厂public class WordSenderFactory implements AbstractFactory {@Overridepublic Sender producter() {return new WordSender();}}public static void main(final String[] args) {final AbstractFactory factory = new MailSenderFactory();factory.producter().send();final AbstractFactory factory2 = new SmsSenderFactory();factory2.producter().send();// 模拟使用final AbstractFactory factory3 = new WordSenderFactory();factory3.producter().send();}
- 创建型模式-抽象工厂
- 创建型模式-抽象工厂
- 抽象工厂模式(创建型)
- 设计模式-创建型模式-抽象工厂
- [创建型模式:抽象工厂模式]
- 二:创建型模式:抽象工厂模式
- 设计模式-创建型模式-抽象工厂
- 创建型模式之抽象工厂模式
- 【设计模式】创建型模式-抽象工厂
- 创建型模式----抽象工厂模式
- 创建型模式--抽象工厂模式
- 创建型模式之抽象工厂模式
- 创建型模式之抽象工厂模式
- 创建型模式-抽象工厂模式
- 创建型设计模式-抽象工厂模式
- 创建型模式-抽象工厂模式(abstract_factory)
- 创建型模式之抽象工厂模式
- 抽象工厂模式-创建型模式
- Android4.3 开发环境搭建以及HelloWorld例子
- log4net配置使用
- <Win32_6>Win32的验证码程序
- netstat命令及日志分析命令
- hdu 3586 Information Disturbing(树形dp + 二分)
- 创建型模式----抽象工厂模式
- Vim 实用技术,第 3 部分: 定制 Vim(转)
- 轻博客项目
- 简单计算类--可实现字符串读入
- Oracle学习之道:oracle 字段范围查询
- POJ 1442 Black Box
- poj 2289 二分枚举+最大流
- file的getPath getAbsolutePath和getCanonicalPath的不同
- mysql安装时候Apply security setting error问题