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

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

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();

}

 

}

测试结果:

转载于:https://www.cnblogs.com/ghhs/p/5768517.html

你可能感兴趣的文章
【转】IOS数据库操作SQLite3使用详解
查看>>
Android官方技术文档翻译——ApplicationId 与 PackageName
查看>>
设计网站大全
查看>>
JVM CUP占用率过高排除方法,windows环境
查看>>
【转】JAVA字符串格式化-String.format()的使用
查看>>
【转】ButterKnife基本使用--不错
查看>>
【转】VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”...
查看>>
函数中关于const关键字使用的注意事项
查看>>
微信架构(转)
查看>>
Web项目中的路径问题
查看>>
js随机数的取整
查看>>
关于解析漏洞
查看>>
十大经典预测算法(六)---集成学习(模型融合算法)
查看>>
用php做一个简单的注册用户功能
查看>>
一款基于css3的3D图片翻页切换特效
查看>>
Feign使用Hystrix无效原因及解决方法
查看>>
Sizeof与Strlen的区别与联系
查看>>
hadoop2.2.0_hbase0.96_zookeeper3.4.5全分布式安装文档下载
查看>>
Flutter 贝塞尔曲线切割
查看>>
golang 的编译安装以及supervisord部署
查看>>