java设计模式第12弹--工厂模式
2015-09-18 16:39
218 查看
一、工厂方法模式分为三种
1.简单工厂模式
2.普通工厂模式
3.抽象工厂模式
有些书中将1,2合并为一个模式,下面我们逐个介绍下这三个模式,个人觉得1,2是没有必要再细分的,合并为一个普通工厂模式也是极好的!!!
1.简单工厂模式
2.1普通工厂模式也是多个工厂方法模式,是对简单工厂方法模式的改进,在简单工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
修改下工厂类就可以了,代码如下
然后是测试类,改成如下
2.2,其实普通工厂模式里面还有一个就是静态工厂模式,其实就是他工厂类的方法加上static 调用的时候直接Class.method()就可以了,并没有什么,也贴下代码
测试代码改成如下
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
3.抽象工厂模式
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
两个实现类
工厂的接口
工厂的两个实现类
测试代码
1.简单工厂模式
2.普通工厂模式
3.抽象工厂模式
有些书中将1,2合并为一个模式,下面我们逐个介绍下这三个模式,个人觉得1,2是没有必要再细分的,合并为一个普通工厂模式也是极好的!!!
1.简单工厂模式
/*** * 接口类--创建两者的共同接口类 * @author 素剑步青尘 * */ public interface Sender { public void send(); }
/*** * 创建实现类 * @author 素剑步青尘 * */ public class StudentSender implements Sender{ @Override public void send() { System.out.println("这是学生发送的信息"); } }
public class TeacherSender implements Sender{ @Override public void send() { System.out.println("这是教师发送的信息"); } }
/*** * 创建工厂类 * @author 素剑步青尘 * */ public class SenderFactory { public Sender produce(String type){ switch (type) { case "teacher": return new TeacherSender(); case "student": return new StudentSender(); default: return null; } } }
public class TestFactoryDemo { /**创建测试类 * @param args */ public static void main(String[] args) { SenderFactory sendFactory = new SenderFactory(); Sender sender =sendFactory.produce("teacher"); sender.send(); } }
2.1普通工厂模式也是多个工厂方法模式,是对简单工厂方法模式的改进,在简单工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
修改下工厂类就可以了,代码如下
/*** * 创建工厂类 * @author 素剑步青尘 * */ public class SenderFactory { public Sender teacherSend(){ return new TeacherSender(); } public Sender studentSend(){ return new StudentSender(); } }
然后是测试类,改成如下
public class TestFactoryDemo { /** * @param args */ public static void main(String[] args) { SenderFactory sendFactory = new SenderFactory(); Sender sender =sendFactory.teacherSend(); sender.send(); } }
2.2,其实普通工厂模式里面还有一个就是静态工厂模式,其实就是他工厂类的方法加上static 调用的时候直接Class.method()就可以了,并没有什么,也贴下代码
/*** * 创建工厂类 * @author 素剑步青尘 * */ public class SenderFactory { public static Sender teacherSend(){ return new TeacherSender(); } public static Sender studentSend(){ return new StudentSender(); } }
测试代码改成如下
public class TestFactoryDemo { /** * @param args */ public static void main(String[] args) { Sender sender =SenderFactory.teacherSend(); sender.send(); } }
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
3.抽象工厂模式
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
public interface Sender { public void send(); }
两个实现类
public class TeacherSender implements Sender{ @Override public void send() { System.out.println("这是教师发送的信息..."); } }
public class StudentSender implements Sender{ @Override public void send() { System.out.println("这是学生发送的信息"); } }
工厂的接口
public interface Provider { public Sender produce(); }
工厂的两个实现类
public class StudentFactory implements Provider{ @Override public Sender produce() { return new StudentSender(); } }
public class TeacherFactory implements Provider{ @Override public Sender produce() { return new TeacherSender(); } }
测试代码
public class FactoryTest { /** * @param args */ public static void main(String[] args) { Provider provider = new TeacherFactory(); Sender sender = provider.produce(); sender.send(); } }
相关文章推荐
- Android使用XUtils框架上传照片(一张或多张)和文本,服务器使用struts2接收
- 在eclipse中将android项目生成apk并且给apk签名
- java学习笔记之接口
- Java 英文首字母大写
- xpath 在java中的应用
- Java学习笔记07 集合框架
- java学习笔记之常用类
- Java的File.separator
- SSH深度历险记(八) 剖析SSH核心原则+Spring依赖注入的三种方式
- testng dataprovider 的几种用法以及Java中的二维数组
- java生成范围内的纯数字随机数
- springmvc二级缓存,查询缓存
- java学习笔记之异常
- java正则表达式的一个例子
- 解决spring要求jdk1.5或更高的问题
- Jboss7使用指定jdk(续)
- JAVA基础学习(十二)--多线程一线程之间的通信
- Spring定时任务的几种实现
- Java内存区域
- JAVA设计模式之工厂模式 简单讲解(一)