第一、工厂模式
首先简单介绍工厂模式:
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
直接上定义,脑壳子都看得疼,不如直接上实际编程样例
假设,我们现在定义了一个shape接口,他有三种实现,
第一种是Circle;第二种是Square;第三种是Rectangle
在之前的编程习惯中,我必然是先实例化其中的某一个类,然后调用他的方法。但是通过工厂模式,我们可以将实例化延迟到使用该方法的时候。
接下来直接上例子
首先是创建接口,然后把三个实现类给写好
Shape.java:
public interface Shape {
void draw();
}
Rectangle.java
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
Square.java
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
Circle.java
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
接着到了工厂模式的重头戏,创建工厂类,通过调用它的函数,来实例化三个实现类中的某一个
ShapeFactory.java
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;
}
}
最后就是使用工厂类了
Use.java
public class Use{
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();
}
}
输出结果也会符合预期
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
以上只是简单方法模式,将所有的实现类都归结于一个工厂类中,在实际应用中,我们还可以使用工厂方法模式,细化工厂类
还是用上面的例子,我们定义新的工厂方法:
首先是一个抽象工厂类
AbsShapeFactory.java
public class AbsShapeFactory{
public Shape getShape(String shapeType);
}
接着定义两种具体工厂类
ShapeFactory1.java
public class ShapeFactory1 extends AbsShapeFactory{
//使用 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();
}
return null;
}
}
ShapeFactory2.java
public class ShapeFactory2 extends AbsShapeFactory {
public Shape getShape(String shapeType){
if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
这样就完成了工厂类的分工
上面两种都是对一个接口shape进行使用,如果在添加一个接口,例如behavior,那么可以使用抽象工厂模式,原理与工厂方法模式类似。我们可以使用一个工厂类来调用shape的实现类,另一个工厂类调用behavior的实现类。
工厂方法可以灵活解决需求变动的问题,但是也有缺陷。
因为无论上述哪种模式,由于可能封装了大量对象和工厂创建,新加产品需要修改已定义好的工厂相关的类,因此对于产品和工厂的扩展不太友好,利弊需要权衡一下。