工厂模式是Java中很常用的设计模式之一,主要用来提供一种创建对象的方式,在该设计模式中,创建对象的逻辑不会暴露给用户,提供给用户的是指向所创建对象的一个共同的接口。工厂模式大致可以分为三种,简单工厂模式、工厂方法模式以及抽象工厂模式,这里我们先介绍简单工厂模式。
介绍
目的
定义一个创建对象的接口,具体创建哪个对象由用户决定后其实现类执行,将创建对象延迟到子类去执行。主要解决了接口的选择问题。
场景
当我们需要在不同条件下创建不同对象时,只需要向工厂类指定想要生成的对象,工厂类便会直接生成对应的对象。
应用实例
当你需要一辆汽车时,向工厂说出你想要车的名字就可以直接提货,不需要管该汽车是如何创建的。当你使用JDBC或者一些ORM框架去连接不同数据库时,也可以使用工厂模式去设计。
代码展示
public interface Shape {
void draw();
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("I draw a Circle!!!");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("I draw a Rectangle!!!");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("I draw a Square!!!");
}
}
public class ShapeFactory {
public static final String CIRCLE = "CIRCLE";
public static final String SQUARE = "SQUARE";
public static final String RECTANGLE = "RECTANGLE";
public static Shape getShape(String type){
Shape shape = null;
switch (type){
case CIRCLE :
shape = new Circle();break;
case SQUARE :
shape = new Square();break;
case RECTANGLE :
shape = new Rectangle();break;
default: break;
}
return shape;
}
}
测试
public class Test {
public static void main(String[] args) {
Shape rectangle = ShapeFactory.getShape(ShapeFactory.RECTANGLE);
rectangle.draw();
Shape circle = ShapeFactory.getShape(ShapeFactory.CIRCLE);
circle.draw();
Shape square = ShapeFactory.getShape(ShapeFactory.SQUARE);
square.draw();
}
}
//结果
//I draw a Rectangle!!!
//I draw a Circle!!!
//I draw a Square!!!
优点
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点
每次增加一个产品时,都需要增加一个具体类和修改工厂类,耦合度高,可扩展性差,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。