工厂模式是一种创建型模式,提供了一种创建对象的最佳方法模式。
应用实例:
- 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
- Hibernate 换数据库只需换方言和驱动就可以。
使用场景:
- 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
- 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
- 设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
注意事项:
作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
示例:
/**
*工厂模式
*/
/*step one :创建一个接口*/
interface Shape{
void draw();
}
/*step two : 创建实现接口的实体类*/
class Circle implements Shape{
@Override
public void draw(){
System.out.println("Inside Circle::draw() method.");
}
}
class Square implements Shape{
@Override
public void draw(){
System.out.println("Inside Square::draw() method.");
}
}
class Rectangle implements Shape{
@Override
public void draw(){
System.out.println("Inside Rectangle::draw() method.");
}
}
/*创建一个工厂,用于生成指定的实体类对象*/
class ShapeFactory{
//使用getShape方法获取形状类型的对象
public Shape getShape(String shapeType){
if(shapeType=="CIRCLE"){
return new Circle();
}
else if (shapeType=="SQUARE"){
return new Square();
}
else if (shapeType=="RECTANGLE"){
return new Rectangle();
}
else {
System.out.println("参数不符合要求创建对象失败");
return null;
}
}
}
/*测试*/
public class FactoryPattrenDemo{
public static void main(String[] args){
//创建工厂对象
ShapeFactory shapeFactory =new ShapeFactory();
//使用工厂类中的方法来获得相应的实体类对象
Shape shape0 = shapeFactory.getShape("");
Shape shape00=shapeFactory.getShape("dsf");
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();
}
}