工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式
来源:互联网 发布:static在java中的作用 编辑:程序博客网 时间:2024/04/28 17:34
工厂模式适合凡是出现大量对象需要创建,而且这些对象拥有相同的接口,可以使用工厂模式进行创建。
简单工厂模式
简单工厂模式分为三种:普通工厂模式、多个方法工厂模式、静态方法工厂模式
以发送QQ消息或者微信消息为例来说明:
普通工厂模式
/** * 两种共同的接口 */public interface Message { public void send();}
//QQ消息public class QQMessage implements Message { @Override public void send() { System.out.println("发送QQ消息"); }}
//微信消息public class WeiXinMessage implements Message { @Override public void send() { System.out.println("发送微信消息"); }}
//消息发送工厂类public class MessageFactory { public Message sendMessage(String type){ if("QQ".equals(type)){ return new QQMessage(); } else if("WeiXin".equals(type)){ return new WeiXinMessage(); }else{ return null; } }}
//消息发送测试public class MessageTest { public static void main(String[] args) { MessageFactory messageFactory=new MessageFactory(); Message message=messageFactory.sendMessage("QQ"); message.send(); }}
多个方法工厂模式
在普通工厂中,如果传递的字符串和工厂中预定的不一致,则不能正确的创建对象。
对工厂类改进如下:
//消息发送工厂类public class MessageFactory { public Message sendQQ(){ return new QQMessage(); } public Message sendWeiXin(){ return new WeiXinMessage(); }}
//消息发送测试public class MessageTest { public static void main(String[] args) { MessageFactory messageFactory=new MessageFactory(); Message message=messageFactory.sendWeiXin(); message.send(); }}
静态方法工厂模式
在多个方法中,还需要创建一个工厂对象才可以调用其方法,可以吧工程类中的方法设置为静态的。
对工厂类改进如下:
//消息发送工厂类public class MessageFactory { public static Message sendQQ(){ return new QQMessage(); } public static Message sendWeiXin(){ return new WeiXinMessage(); }}
//消息发送测试public class MessageTest { public static void main(String[] args) { MessageFactory.sendWeiXin().send(); }}
工厂方法模式(Factory Method)
对上面的简单工厂模式进行分析易知:类的创建依赖于工厂类,也就是说,如果要扩展程序,需要修改工厂类,违背了闭包的原则。因此就用到工厂方法模式:创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功能,就可以直接增加工厂类,而不用修改工厂接口原有的代码。
/** * 两种消息共同的接口 */public interface Message { public void send();}
//QQ消息public class QQMessage implements Message { @Override public void send() { System.out.println("发送QQ消息"); }}
//微信消息public class WeiXinMessage implements Message { @Override public void send() { System.out.println("发送微信消息"); }}
//消息发送工厂接口public interface MessageFactory { public Message sendMessage();}
//发送QQ消息的工厂类public class QQFactory implements MessageFactory { @Override public Message sendMessage() { return new QQMessage(); }}
//发送微信消息的工厂类public class WeiXinFactory implements MessageFactory { @Override public Message sendMessage() { return new WeiXinMessage(); }}
//消息发送测试public class MessageTest { public static void main(String[] args) { MessageFactory messageFactory=new QQFactory(); Message message=messageFactory.sendMessage(); message.send(); }}
抽象工厂模式(Abstract Factory)
抽象工厂模式有四种角色:
- 抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心
- 具体工厂(Concrete Factory)角色:这个角色直接创建实例
- 抽象产品(Abstract Product)角色:这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
具体产品(Concrete Product)角色:这个角色是具体的产品
下面还是以发消息的例子来说明,假如可以发送QQ和微信两种消息,并且QQ可以发送语音消息和视频消息,微信可以发送文字消息和视频消息,其中,在这四种消息中,语音、文字属于省流量的消息,图片和视频属于费流量的消息。
第一:先创建两种消息接口
//QQ消息接口public interface QQMessage {}
//微信消息接口public interface WeiXinMessage {}
第二:(1)实现QQ下的两种消息发送方式
//QQ消息下的具体产品1:QQ语音消息public class SoundQQMessage implements QQMessage{ public SoundQQMessage(){ System.out.println("发送QQ消息:QQ语音消息"); }}
//QQ消息下的具体产品2:QQ视频消息public class VideoQQMessage implements QQMessage { public VideoQQMessage(){ System.out.println("发送QQ消息:QQ视频消息"); }}
(2)实现微信下的两种消息发送方式
//微信消息下的具体产品1:微信文字消息public class CharacterWeiXinMessage implements WeiXinMessage { public CharacterWeiXinMessage(){ System.out.println("发送微信消息:微信文字消息"); }}
//微信消息下的具体产品2:微信图片消息public class PhotoWeiXinMessage implements WeiXinMessage { public PhotoWeiXinMessage(){ System.out.println("发送微信消息:微信图片消息"); }}
第三:发送消息的接口
//发送消息的工厂接口public interface MessageFactory { public QQMessage sendQQMessage(); public WeiXinMessage sendWeiXinMessage();}
第四:实现具体的发送消息工厂
//具体的工厂类1:只负责发送语音文字这样省流量的信息public class Sound_Character_MessageFactory implements MessageFactory { @Override public QQMessage sendQQMessage() { return new SoundQQMessage(); } @Override public WeiXinMessage sendWeiXinMessage() { return new CharacterWeiXinMessage(); }}
//具体的工厂类2:只负责发送视频图片这样费流量的信息public class Video_Photo_MessageFactory implements MessageFactory { @Override public QQMessage sendQQMessage() { return new VideoQQMessage(); } @Override public WeiXinMessage sendWeiXinMessage() { return new PhotoWeiXinMessage(); }}
第五:发送消息测试
//发送消息测试public class FactoryTest { public static void main(String[] args) { MessageFactory messageFactory1=null; System.out.println("工厂1:发送省流量的消息"); messageFactory1=new Sound_Character_MessageFactory(); messageFactory1.sendQQMessage(); messageFactory1.sendWeiXinMessage(); System.out.println("................................."); MessageFactory messageFactory2=null; System.out.println("工厂2:发送费流量的消息"); messageFactory2=new Video_Photo_MessageFactory(); messageFactory2.sendQQMessage(); messageFactory2.sendWeiXinMessage(); }}
工厂方法模式 和 抽象工厂模式 的 区别
- 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
- 工厂方法模式的具体工厂只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
- 工厂方法创建 “一种” 产品,抽象工厂需要创建一些列产品,说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线。
1 0
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂|工厂方法|抽象工厂模式
- 设计模式-工厂模式(简单工厂,工厂方法,抽象工厂)
- java工厂模式-简单工厂,工厂方法,抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂、工厂模式、抽象工厂模式
- 简单工厂&工厂模式&抽象工厂模式
- 简单工厂模式、工厂方法模式和抽象工厂模式
- 简单工厂模式,工厂方法模式,抽象工厂模式区别
- 简单工厂模式,工厂方法模式,抽象工厂模式 比较
- 简单工厂模式,工厂方法模式,抽象工厂模式 比较
- 简单工厂模式 工厂方法模式 抽象工厂模式
- 简单工厂模式,工厂方法模式,抽象工厂模式 比较
- 简单工厂模式,工厂方法模式,抽象工厂模式 比较
- 简单工厂模式,工厂方法模式,抽象工厂模式
- 简单工厂模式,工厂方法模式,抽象工厂模式
- 简单工厂模式、工厂方法模式、抽象工厂模式
- hdu 5200 Trees(离线处理,排序)
- 字符串匹配各种算法
- laravel的启动过程
- 小白学Tensorflow之多层神经网络
- Ideal+spring boot+thymeleaf 的热部署问题处理
- 工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式
- CodeForces 289B Polo the Penguin and Matrix
- SDKD 2016 Summer Single Contest #12 .F
- 文本居中
- ICCV 2015 揭开152层神经网络的面纱(Deep Residual Learning )
- Beaglebone black-固件更新
- STL之Vector(三):Vector常用函数
- Crashing Robots
- ACM选票统计(C语言)