1.普通工厂模式

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

1-1.建立Sender接口

public interface Sender {
public void send();
}

1-2 创建实现类实现Sender接口,比如文本与图像以及视频类

文本类

public class TextSender implements Sender {
public void send() {
System.out.println("this is Textsender!");
}
}

图像类

public class ImageSender implements Sender {
public void send() {
System.out.println("this is Imagessender!");
}
}

视频类

public class VideoSender implements Sender {
public void send() {
System.out.println("this is Imagessender!");
}
}

1-3建立工厂类

public class SendFactory {
public Sender produce(String type) {
if ("mail".equals(type)) {
return new TextSender();
}
else if ("sms".equals(type)) {
return new ImageSender();
}
else if ("video".equals(type)) {
return new VideoSender();
}
else {
System.out.println("请输入正确的类型!");
return null;
}
}
}

1-4 普通的工厂模式设计已经完成了。下面在main中测试下

public class Main {

public static void main(String[] args) {
SendFactory factory = new SendFactory();
Sender text=factory.produce("text");
text.send();
Sender image=factory.produce("image");
image.send();
Sender video=factory.produce("video");
video.send();

}

}

测试结果截图:

但是这种普通工厂方式一旦参数不正确不会产生对象。为了改进这个方式便有了多工厂方法,一个方法产生对应的一个对象,通过调用方法来产生对象

2-1多工厂模式

只要改变1-3中的工厂类即可。

public class SendFactory {
public static Sender produceText(){
return new TextSender();
}
public static Sender produceImage(){
return new ImageSender();
}
public static Sender produceVideo(){
return new VideoSender();
}
}

在main中测试

2-2

public class Main {

public static void main(String[] args) {
SendFactory factory = new SendFactory();
Sender text = factory.produceText();
text.send();
Sender image = factory.produceImage();
image.send();
Sender video = factory.produceVideo();
video.send();

}

}

测试结果如下图

3。上面例子要是有新的类产生要去更改工厂类,不利于维护,对于这样的情况我们可以采用抽象工厂模式。

还是用上面的作为例子。

3-1.建立Sender接口

public interface Sender {
public void send();
}

3-2 创建实现类实现Sender接口,比如文本与图像以及视频类

文本类

public class TextSender implements Sender {
public void send() {
System.out.println("this is Textsender!"); 
}
}

图像类

public class ImageSender implements Sender {
public void send() {
System.out.println("this is Imagessender!"); 
}
}

视频类

public class VideoSender implements Sender {
public void send() {
System.out.println("this is Imagessender!"); 
}
}

3-3提供一个接口让工厂类来实现这边我用offer接口

public interface Offer {

public Sender offer();

}

3-4 对应类由对应工厂来生产

public class TextSenderFactory implements Offer {

public Sender offer() {

return new TextSender();

}

}

public class ImageSenderFactory implements Offer {

public Sender offer() {

return new ImageSender();

}

}

public class VideoSenderFactory implements Offer {

public Sender offer() {

return new VideoSender() ;

}

}

3-5.已经完成了去main中测试下

public class Main {

public static void main(String[] args) {

Offer textoffer=new TextSenderFactory();

Sender text=textoffer.offer();

text.send();

Offer imageoffer=new ImageSenderFactory();

Sender image=imageoffer.offer();

image.send();

}

}

测试结果:

最新文章

  1. 【VS】vs修改大小写快捷键
  2. NSScanner知悉 (转)
  3. Scalaz(46)- scalaz-stream 基础介绍
  4. jsp+ajax实现无刷新
  5. SharePoint 2013 一些小技巧
  6. MySQL – 导出数据成csv
  7. CSS3 功能
  8. SQLite介绍、学习笔记、性能测试
  9. Java8 Stream API
  10. ExecuteScalar 要求已打开且可用的 Connection。连接的当前状态为已关闭。
  11. 多进程用户并发处理Demo(C#版)
  12. MySQL账户管理
  13. CSS样式命名整理(非原创)
  14. Struts(十八):通过CURD来学习PrepareInterceptor拦截器
  15. 从零学习Fluter(六):Flutter仿boss直聘v1.0重构
  16. Django学习之二:Django 项目创建 和 应用创建
  17. LTS本地搭建详述
  18. 通过JPA注解获取某个类的主键字段
  19. 入围T00ls 2018风云人物
  20. python 常用标准库

热门文章

  1. 三读bootmem【转】
  2. Windows下php环境变量的配置
  3. 采集网站特殊文件Meta信息
  4. 一些yuv视频下载地址
  5. luogu P3808 【模板】AC自动机(简单版)
  6. 【UTR #2】题目排列顺序
  7. 官方Java编码规范
  8. Java出现错误“Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )”的问题分析
  9. Linux BPF/bcc for Oracle Tracing
  10. ARC下循环引用的问题