很久没写博客了,最近学了不少东西,感觉陆续地需要总结一下了。
先开始写设计模式吧,今天开篇就从最简单的创建型模式中的简单工厂模式入手。
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
概述
优点
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
注意事项
作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new
就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
代码详解
针对上面的图,我们来写一写代码吧。
创建一个接口
Shape.java
1 2 3
| public interface Shape { void draw(); }
|
创建实现接口的实体类
Rectangle.java
1 2 3 4 5 6 7
| public class Rectangle implements Shape {
@Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } }
|
Square.java
1 2 3 4 5 6 7
| public class Square implements Shape {
@Override public void draw() { System.out.println("Inside Square::draw() method."); } }
|
Circle.java
1 2 3 4 5 6 7
| public class Circle implements Shape {
@Override public void draw() { System.out.println("Inside Circle::draw() method."); } }
|
创建一个工厂
ShapeFactory.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class ShapeFactory { 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; } }
|
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class FactoryPatternDemo {
public static void main(String[] args) { ShapeFactory shapeFactory = new ShapeFactory();
Shape shape1 = shapeFactory.getShape("CIRCLE");
shape1.draw();
Shape shape2 = shapeFactory.getShape("RECTANGLE");
shape2.draw();
Shape shape3 = shapeFactory.getShape("SQUARE");
shape3.draw(); } }
|
总结
使用工厂模式可以使得我们的代码实现松耦合,更容易扩展,工作中应该还是挺常用的。