文章结构: 意义是什么,解决了什么,实例,举例,图解+说明
意义:
工厂模式的意义就是,创建对象的接口,让其子类决定实例化哪个工厂类,让对象的创建过程延迟到子类进行;
解决了什么问题:
主要是解决了接口选择的问题,让其子类实现工厂接口,返回的也是一个抽象的产品,并且关键代码在其子类执行
优点
优点就是,当一个调用者想要创建某一个类的时候,只是需要调用工厂类,创建类的名称就可以返回对应的类的实例。
缺点
缺点就是:当这个接口需要增加实现类的时候,那么就需要在工厂类里面进行增加方法,这也算是硬编码的一种,还有就是当我们需要增加一个产品的时候,需要增加一个类和对象的实现工厂,一定程度上增加了编码的复杂性
实例
步骤一:创建一个接口,并定义一个图形接口,当作基础接口
public interface Shape {
void draw();
}
步骤二: 创建三个 图形的实体类,并实现图形接口
长方形类
public class Rectange implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
正方形类
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
圆形类
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
步骤三: 创建一个工厂负责创建三个图形实体类
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;
}
}
步骤四: 使用步骤三创建的工厂类型,获取实体类的对象
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(); }
}
步骤5: 输出的结果
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
图解:整个的调用流程,其实就是方便了类的创建,或者是说,当一个东西可以进行归类的时候,可以选用工厂模式进行传创建,应为这样就可以固定住想对应的操作,比如当我想看一本书的时候,我就可以定义一个接口叫做IBook同时定义一个方法叫see() ,接下来定义几个书籍《三国》《水浒》《西游记》的实体类,实现IBook的接口,那么接下来就可以,定义一个工厂类创建这三个对象,将返回值定义为IBook,同时提供选择器进行选择,用于创建对应的实现类,那么每次个不同的方法都会返回不一样的书记对象,那么see()方法,调用整个工厂之后再次调用see方法,出来的就是 see()... 三国 水浒 西游记