设计模式 - 工厂模式
2016-05-30 08:41
253 查看
工厂模式分为工厂方法模式和抽象工厂模式。
我们什么时候需要使用工厂模式?
对那些实现同一接口的类,我们可以创建一个工厂类,专门用于这些类的实例创建。
一、工厂方法模式 Factory Method
工厂方法模式有3种:普通工厂模式、多个工厂方法模式和静态工厂方法模式。
1、普通工厂模式
2、多个工厂方法模式
多个工厂方法模式是对普通工厂模式的改进。
普通工厂模式中对象的创建始终在一个工厂方法中实现,而多个工厂方法模式提供多个工厂方法来创建对象。
public class SendFactory {
public Sender produceEmail() {
<span style="white-space:pre"> </span>return new EmailSender();
}
public Sender produceSMS() {
<span style="white-space:pre"> </span>return new SMSSender();
}
}
3、静态工厂方法模式
将多个工厂方法模式中的工厂方法都设置为静态,即不需要创建工厂类的实例就可以创建对象。
public class SendFactory {
public static Sender produceEmail() {
<span style="white-space:pre"> </span>return new EmailSender();
}
public static Sender produceSMS() {
<span style="white-space:pre"> </span>return new SMSSender();
}
}
二、抽象工厂模式 Abstract Factory
抽象工厂模式是对工厂方法模式的改进。
工厂方法模式的缺点:如果想拓展工厂类的功能,我们就必须修改工厂类,在其中添加新的工厂方法,这
显然违反了设计模式的开闭原则(拓展开放、修改关闭)。
抽象工厂模式通过创建多个工厂类,可以避免这个问题。当我们需要拓展功能时,只需要新增工厂类即可,
而不需要修改原工厂类的代码。
/** 1、实现同一个接口 **/
public interface Sender {
public void send();
}
/** 2、多个实现类 **/
public class EmailSender implements Sender {
@override
public void send() {
<span style="white-space:pre"> </span>System.out.println(“Send Email.”);
}
}
public class SMSSender implements Sender {
@override
public void send() {
<span style="white-space:pre"> </span>System.out.println(“Send SMS.”);
}
}
/** 3、创建多个工厂类 **/
public class SendEmialFactory implements Provider {
@override
public Sender produce() {
<span style="white-space:pre"> </span>return new EmailSender();
}
}
public class SMSEmialFactory implements Provider {
@override
public Sender produce() {
<span style="white-space:pre"> </span>return new SMSSender();
}
}
/** 4、提供对外接口 **/
public interface Provider {
public Sender produce();
}
我们什么时候需要使用工厂模式?
对那些实现同一接口的类,我们可以创建一个工厂类,专门用于这些类的实例创建。
一、工厂方法模式 Factory Method
工厂方法模式有3种:普通工厂模式、多个工厂方法模式和静态工厂方法模式。
1、普通工厂模式
/** 1、 实现同一个接口 **/ public interface Sender { public void send(); } /** 2、多个实现类 **/ public class EmailSender implements Sender { @override public void send() { <span style="white-space:pre"> </span>System.out.println(“Send Email.”); } } public class SMSSender implements Sender { @override public void send() { <span style="white-space:pre"> </span>System.out.println(“Send SMS.”); } } /** 3、一个工厂类 **/ public class SendFactory { public Sender produce(String type){ if(“Email”.equals(type)) { <span style="white-space:pre"> </span> return new EmailSender(); <span style="white-space:pre"> </span>} else if (“SMS”.equals(type)) { <span style="white-space:pre"> </span> return new SMSSender(); <span style="white-space:pre"> </span>} else { <span style="white-space:pre"> </span> System.out.println(“No such type!”); <span style="white-space:pre"> </span> return null; } } }
2、多个工厂方法模式
多个工厂方法模式是对普通工厂模式的改进。
普通工厂模式中对象的创建始终在一个工厂方法中实现,而多个工厂方法模式提供多个工厂方法来创建对象。
public class SendFactory {
public Sender produceEmail() {
<span style="white-space:pre"> </span>return new EmailSender();
}
public Sender produceSMS() {
<span style="white-space:pre"> </span>return new SMSSender();
}
}
3、静态工厂方法模式
将多个工厂方法模式中的工厂方法都设置为静态,即不需要创建工厂类的实例就可以创建对象。
public class SendFactory {
public static Sender produceEmail() {
<span style="white-space:pre"> </span>return new EmailSender();
}
public static Sender produceSMS() {
<span style="white-space:pre"> </span>return new SMSSender();
}
}
二、抽象工厂模式 Abstract Factory
抽象工厂模式是对工厂方法模式的改进。
工厂方法模式的缺点:如果想拓展工厂类的功能,我们就必须修改工厂类,在其中添加新的工厂方法,这
显然违反了设计模式的开闭原则(拓展开放、修改关闭)。
抽象工厂模式通过创建多个工厂类,可以避免这个问题。当我们需要拓展功能时,只需要新增工厂类即可,
而不需要修改原工厂类的代码。
/** 1、实现同一个接口 **/
public interface Sender {
public void send();
}
/** 2、多个实现类 **/
public class EmailSender implements Sender {
@override
public void send() {
<span style="white-space:pre"> </span>System.out.println(“Send Email.”);
}
}
public class SMSSender implements Sender {
@override
public void send() {
<span style="white-space:pre"> </span>System.out.println(“Send SMS.”);
}
}
/** 3、创建多个工厂类 **/
public class SendEmialFactory implements Provider {
@override
public Sender produce() {
<span style="white-space:pre"> </span>return new EmailSender();
}
}
public class SMSEmialFactory implements Provider {
@override
public Sender produce() {
<span style="white-space:pre"> </span>return new SMSSender();
}
}
/** 4、提供对外接口 **/
public interface Provider {
public Sender produce();
}
相关文章推荐
- 过滤器、拦截器、监听器的区别
- 怎么判断百度网盘分享连接已经失效?有那么简单吗?
- Activity的四种启动方式
- 四阶模仿重要公式
- ORACLE GROUPING函数的使用
- 结束北漂生活倒计时中
- Web应用程序项目以配置使用IIS。未找到Web服务器
- 修改UIWebView中字体的大小
- java集合类详解
- 十三周作业显示
- 输入一个字符串,输出这个字符串中重复的元素及其个数
- 子集生成 二进制法
- 团队冲刺2---个人工作总结六(5.30)
- mysql基础知识
- Java集合框架源码剖析:LinkedHashSet 和 LinkedHashMap
- priority_queue
- CGI与FastCGI 转
- C#获取类以及类下的方法(用于Asp.Net MVC)
- tomcat部署web应用的4种方法
- 选项菜单Option Menu