使用场景:
1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
工厂模式实现方式:
定义一个公共的接口 多个相同实例类型实现同一个接口 创建一个工厂类对象 提供一个获取接口类型方法 方法内部为创建实现接口的不同实例
用户在获取需要的自己类型的实例的时候不需要知道该实例是如何创建的 只需要向工厂提供需要获取的实例名称
1、定义公共接口
package cn.ac.bcc.factory; /** * 定义形状接口 * @author Administrator * */ public interface Shape { void draw(); }
2、定义形状实例实现形状接口
package cn.ac.bcc.factory.impl; import cn.ac.bcc.factory.Shape; /** * 定义一个三角形实例实现形状接口 * @author Administrator */ public class Triangle implements Shape { @Override public void draw() { // TODO Auto-generated method stub System.out.println("我要化一个三角形"); } }
package cn.ac.bcc.factory.impl; import cn.ac.bcc.factory.Shape; /** * 定义一个正方形实例实现形状接口 * @author Administrator * */ public class Square implements Shape{ @Override public void draw() { // TODO Auto-generated method stub System.out.println("我画一个正方形"); } }
package cn.ac.bcc.factory.impl; import cn.ac.bcc.factory.Shape; /** * 定义一个圆形实例实现形状接口 * @author Administrator * */ public class Circle implements Shape { @Override public void draw() { // TODO Auto-generated method stub System.out.println("我画一个圆形"); } }
3、创建工厂类
package cn.ac.bcc.factory; import cn.ac.bcc.factory.impl.Circle; import cn.ac.bcc.factory.impl.Square; import cn.ac.bcc.factory.impl.Triangle; /** * 定义一个形状工厂 * @author Administrator * */ public class ShapeFactory { /** * 获取形状方法 * @param shapeType 要获得的形状名称 * @return */ public static Shape getShape(String shapeType){ if(shapeType == null){ return null; } if(shapeType.equals("circle")){ return new Circle(); } if(shapeType.equals("triangle")){ return new Triangle(); } if(shapeType.equals("square")){ return new Square(); } return null; } }
测试类:
package cn.ac.bcc.factory.test; import cn.ac.bcc.factory.Shape; import cn.ac.bcc.factory.ShapeFactory; public class FactoryTest { public static void main(String[] args) { //向工厂中提供想要获取的形状名称 用户不需要知道工厂是如何实现的 Shape shape = ShapeFactory.getShape("circle"); shape.draw(); Shape shape2 = ShapeFactory.getShape("triangle"); shape2.draw(); } }