商盈网站建设,域名注册商查询工具,北京做网站比较有名的公司有哪些,百度一下你就知道手机版工厂模式 Factory Pattern 摘要实现范例 工厂模式#xff08;Factory Pattern#xff09;提供了一种创建对象的最佳方式 工厂模式在创建对象时不会对客户端暴露创建逻辑#xff0c;并且是通过使用一个共同的接口来指向新创建的对象 工厂模式属于创建型模式 摘要
1. 意图
… 工厂模式 Factory Pattern 摘要实现范例 工厂模式Factory Pattern提供了一种创建对象的最佳方式 工厂模式在创建对象时不会对客户端暴露创建逻辑并且是通过使用一个共同的接口来指向新创建的对象 工厂模式属于创建型模式 摘要
1. 意图
定义一个创建对象的接口让其子类自己决定实例化哪一个工厂类工厂模式使其创建过程延迟到子类进行2. 主要解决
主要解决接口选择的问题3. 何时使用
我们明确地计划不同条件下创建不同实例时4. 如何解决
让其子类实现工厂接口返回的也是一个抽象的产品5. 关键代码
创建过程在其子类执行6. 应用实例
您需要一辆汽车可以直接从工厂里面提货而不用去管这辆汽车是怎么做出来的以及这个汽车里面的具体实现Hibernate换数据库只需换方言和驱动就可以
7. 优点
一个调用者想创建一个对象只要知道其名称就可以了扩展性高如果想增加一个产品只要扩展一个工厂类就可以屏蔽产品的具体实现调用者只关心产品的接口
8. 缺点
每次增加一个产品时都需要增加一个具体类和对象实现工厂使得系统中类的个数成倍增加在一定程度上增加了系统的复杂度同时也增加了系统具体类的依赖这并不是什么好事
9. 使用场景
日志记录器记录可能记录到本地硬盘.系统事件.远程服务器等用户可以选择记录日志到什么地方数据库访问当用户不知道最后系统采用哪一类数据库以及数据库可能有变化时设计一个连接服务器的框架需要三个协议”POP3″.”IMAP”.”HTTP”可以把这三个作为产品类共同实现一个接口
10. 注意事项 作为一种创建类模式在任何需要生成复杂对象的地方都可以使用工厂方法模式 有一点需要注意的地方就是复杂对象适合使用工厂模式而简单对象特别是只需要通过 new 就可以完成创建的对象无需使用工厂模式。如果使用工厂模式就需要引入一个工厂类会增加系统的复杂度
实现 创建一个Shape接口和实现Shape接口的实体类下一步是定义工厂类ShapeFactoryFactoryPatternDemo使用ShapeFactory来获取Shape对象
范例
1. 创建一个接口
Shape.java
package com.demo.gof;
public interface Shape {void draw();
}2. 创建实现接口的实体类
Rectangle.java
package com.demo.gof;
public class Rectangle implements Shape {Overridepublic void draw() {System.out.println(Inside Rectangle::draw() method.);}
}Square.java
package com.demo.gof;
public class Square implements Shape {Overridepublic void draw() {System.out.println(Inside Square::draw() method.);}
}Circle.java
package com.demo.gof;
public class Circle implements Shape {Overridepublic void draw() {System.out.println(Inside Circle::draw() method.);}
}3. 创建一个工厂生成基于给定信息的实体类的对象
ShapeFactory.java
package com.demo.gof;
public class ShapeFactory {//使用 getShape 方法获取形状类型的对象public Shape getShape(String shapeType){if(shapeType null){return null;} if(shapeType.equalsIgnoreCase(CIRCLE)){return new Circle();} else if(shapeType.equalsIgnoreCase(RECTANGLE)){return new Rectangle();} else if(shapeType.equalsIgnoreCase(SQUARE)){return new Square();}return null;}
}4. 使用该工厂通过传递类型信息来获取实体类的对象
FactoryPatternDemo.java
package com.demo.gof;
public class FactoryPatternDemo {public static void main(String[] args) {ShapeFactory shapeFactory new ShapeFactory();//获取 Circle 的对象并调用它的 draw 方法Shape shape1 shapeFactory.getShape(CIRCLE);//调用 Circle 的 draw 方法shape1.draw();//获取 Rectangle 的对象并调用它的 draw 方法Shape shape2 shapeFactory.getShape(RECTANGLE);//调用 Rectangle 的 draw 方法shape2.draw();//获取 Square 的对象并调用它的 draw 方法Shape shape3 shapeFactory.getShape(SQUARE);//调用 Square 的 draw 方法shape3.draw();}
}
编译运行以上 Java 范例输出结果如下
$ javac -d . src/main/com.demo/gof/FactoryPatternDemo.java
$ java com.demo.gof.FactoryPatternDemo
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.