设计模式-创建型模式-工厂模式

124 阅读3分钟

工厂模式定义

工厂模式 Factory Pattern 属于创建型模式,是 java 中最常用的设计模式,他提供了一种创建对象极佳的方法。提供了一种将对象的实例化过程封装在工厂类中的方式

意图

创建一个对象的接口,让子类决定去实例化哪一个工厂类,工厂模式使创建过程延迟到子类进行。

主要解决

主要解决接口选择问题,让创建过程在子类中执行。

应用实例

1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。

2、Hibernate 换数据库只需换方言和驱动就可以。

优点

调用者想调用对象只需要知道类的名称即可,方便扩展,如果你需要你需要一个产品只需要增加一个工厂类就行。

使用场景

1、日志的保存,用户可以将日志保存在服务器,本地,云端等地方。

2、数据库的访问,用户不需要知道采用的哪一个数据库,以及数据库采取了哪些操作

3、设计链接服务器框架时,可以设计 pop3、impl、http等协议设计类,实现一个共同的接口。

工厂模型的核心角色

抽象产品、具体产品、抽象工厂、具体工厂

样例

汽车

设计产品是汽车,设计了车产品的接口,奥迪和宝马实现了车接口。相对应设计了造车的车工厂接口,奥迪工厂和宝马工厂共同实现了车工厂接口。通过具体的工厂去调用各自的车方法。

image.png

代码

车接口,以及接口实现类的设计

public interface Car {
    void running();
}

public class Audi implements Car{
    @Override
    public void running() {
        System.out.println("Audi 汽车在跑");
    }
}


public class Bmw implements Car{
    @Override
    public void running() {
        System.out.println("BMW 汽车在跑");
    }
}

车工厂和具体工厂实现类的设计

public interface ICarFactory {
    Car getICarFactory();
}

public class AudiFactory implements ICarFactory{
    @Override
    public Car getICarFactory() {
        return new Audi();
    }
}

public class BmwFactory implements ICarFactory{
    @Override
    public Car getICarFactory() {
        return new Bmw();
    }
}

工厂模式客户端的调用

public class FactoryClient {
    public static void main(String[] args) {
        BmwFactory bmwFactory = new BmwFactory();
        bmwFactory.getICarFactory().running();
        new AudiFactory().getICarFactory().running();
    }
}

形状

简单工厂模型,设计了形状的抽象接口,具备画图的方法。三种图形的实现类,设计了图形工厂,客户端通过需要的图形名称去调用工厂。

image.png

代码

创建图形接口以及接口实现类

public interface Shape {
    void draw();
}

public class Circle implements Shape{
    @Override
    public void draw() {
        System.out.println("Circle 执行了 draw()");
    }
}

public class Rectangle implements Shape{
    @Override
    public void draw() {
        System.out.println("Rectangle 类执行了 draw()");
    }
}

public class Triangle implements Shape{
    @Override
    public void draw() {
        System.out.println(this.getClass().getSimpleName()+"执行了"+Thread.currentThread().getStackTrace()[1].getMethodName()+"方法");
    }
}

图形工厂的创建


public class ShapeFactory {
    public Shape getShape(Shape shape){
        if (shape instanceof Rectangle){
            return new Rectangle();
        } else if (shape instanceof Circle) {
            return new Circle();
        } else {
            return new Triangle();
        }
    }

客户端调用


public class FactoryClient {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();
        shapeFactory.getShape(new Rectangle()).draw();
        shapeFactory.getShape(new Circle()).draw();
        shapeFactory.getShape(new Triangle()).draw();
    }
}