设计模式-工厂模式

651 阅读3分钟

文章结构: 意义是什么,解决了什么,实例,举例,图解+说明

意义:

工厂模式的意义就是,创建对象的接口,让其子类决定实例化哪个工厂类,让对象的创建过程延迟到子类进行;

解决了什么问题:

主要是解决了接口选择的问题,让其子类实现工厂接口,返回的也是一个抽象的产品,并且关键代码在其子类执行

优点

优点就是,当一个调用者想要创建某一个类的时候,只是需要调用工厂类,创建类的名称就可以返回对应的类的实例。

缺点

缺点就是:当这个接口需要增加实现类的时候,那么就需要在工厂类里面进行增加方法,这也算是硬编码的一种,还有就是当我们需要增加一个产品的时候,需要增加一个类和对象的实现工厂,一定程度上增加了编码的复杂性

实例

步骤一:创建一个接口,并定义一个图形接口,当作基础接口

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()... 三国 水浒 西游记

image.png