博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
工厂方法模式
阅读量:5915 次
发布时间:2019-06-19

本文共 1745 字,大约阅读时间需要 5 分钟。

hot3.png

工厂方法模式

(Factory Method)

摘自:http://blog.csdn.net/zhangerqing/article/details/8194653

工厂方法模式分为三种:

1.1 普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。关系图如下:

173846_vpky_730588.png

 

举例如下:(一个发邮件和短信的例子)

首先,创建二者的共同接口:

public interface Sender {

void send();

}

创建实体类:

public class MailSender implements Sender{

@Override

public void send() {

System.out.println("this is mail sender");

}

}

public class SmsSender implements Sender {

@Override

public void send() {

System.out.println("this is sms sender");

}

}

 

最后创建工厂类:(用的java7 String 类型支持 switch 语法)

public class SenderFactory {

public Sender produce(String type) {

switch (type) {

case "mail":

return new MailSender();

case "sms":

return new SmsSender();

default:

System.out.println("请输入 正确的类型");

return null;

}

}

}

最后测试一下:

public class Main {

public static void main(String[] args) {

SenderFactory factory = new SenderFactory();

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

sender.send();

}

}

 

1.2 多个工厂方法模式:

是对普通工厂方法的模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确的创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象;关系图如下:

173921_jZll_730588.png

只需将上面的工厂类修改一下 就行,如下:

public class SenderFactory {

public Sender produceMailSender(){

return new MailSender();

}

public Sender produceSmsSender(){

return new SmsSender();

}

}

测试一下:

public class Main {

public static void main(String[] args) {

SenderFactory factory = new SenderFactory();

Sender sender = factory.produceMailSender();

sender.send();

}

}

1.3 静态工厂方法模式

将上面的多个工厂方法模式里的方法置为静态,不需要创建实例,直接调用即可。

public class SenderFactory {

public static Sender produceMailSender() {

return new MailSender();

}

public static Sender produceSmsSender() {

return new SmsSender();

}

}

测试一下:

public class Main {

public static void main(String[] args) {

Sender sender = SenderFactory.produceMailSender();

sender.send();

}

} 

转载于:https://my.oschina.net/litengit/blog/505998

你可能感兴趣的文章
eclipse 自动为getter和setter添加注释
查看>>
我的友情链接
查看>>
DataSet
查看>>
Quartz.NET 前一次任务未执行完成时不触发下次的解决方法
查看>>
python unittest之断言及示例
查看>>
online_judge_1106
查看>>
JAVA_内部类
查看>>
jxl 导入excel
查看>>
虚拟机linux上网问题
查看>>
XMLHttpRequest - 原始AJAX初步
查看>>
laravel/lumen 单元测试
查看>>
csu2161: 漫漫上学路(Hash+最短路)
查看>>
重复引用错误:duplicate symbols for architecture x86_64
查看>>
ucenter1.5通讯过程分析(转载)
查看>>
浏览器中可以访问,但是git命令、go get命令使用时却无法连接
查看>>
Apache Spark源码走读之7 -- Standalone部署方式分析
查看>>
如何避免重构带来的危险
查看>>
有序的双链表
查看>>
MSSQLServer的备份与还原
查看>>
使用MySQL yum源安装MySQL
查看>>