首页 > 其他 > 详细

Factory pattern(工厂模式)

时间:2020-08-31 23:47:25      阅读:97      评论:0      收藏:0      [点我收藏+]

工厂模式概念:

  • 实例化对象,用工厂方法代替new操作
  • 工厂模式包括工厂方法模式和抽象工厂模式
  • 抽象工厂模式是工厂方法模式的扩展

两种工厂模式具体定义:

  • 简单工厂(简单工厂不是设计模式而是编程习惯,有些人误以为是“工厂模式”):将共性的算法抽取,进行抽象定义在一个类作为工厂类,工厂类根据参数化方法来实例化对象

  • 工厂方法模式(Factory Mode):定义一个用于创建对象的接口,让子类来决定实例化的类是哪一个。工厂方法将类实例化延迟到子类

  • 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,无需指定具体类

工厂方法模式

工厂方法模式特点

  • 特点: 创建与使用解耦
  • 关键代码:创建过程在子类执行
  • 使用场景:不同条件下创建不同实例时

1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。

工厂方法模式类图

技术分享图片

  • 抽象工厂(Factory):提供创建产品的接口,调用者通过它访问具体工厂的工厂方法factoryMethod()来创建指定产品。
  • 具体工厂(ConcreteFactory):实现抽象工厂的抽象方法,完成具体产品的创建。
  • 抽象产品(Product):定义产品的规范,描述产品的主要特性和功能。
  • 具体产品(ConcreteProduct):实现抽象产品角色所定义的接口,由具体工厂来创建,与具体工厂一一对应。

简单工厂和工厂方法之间的差异: 简单工厂将全部的事情放在一个地方处理完;工厂方法创建一个框架,让子类决定要如何实现(将对象实例化延迟到子类), 简单工厂不具备工厂方法的弹性无法变更正在创建的产品

实例01:汽车工厂(简单工厂模式)

类图

技术分享图片

实例代码

// 产品类
abstract class Car{
    public String name;
    public String color;

    Car(String _name, String _color){
        this.name = _name;
        this.color = _color;
    }
    abstract void getInfo();
}

class BenzCar extends Car{

    public BenzCar(String _name, String _color){
        super(_name, _color);
    }

    @Override
    void getInfo() {
        System.out.println("汽车品牌:" + this.name + " ,汽车颜色: " + this.color);
    }
}

class BMWCar extends Car{

    public BMWCar(String _name, String _color){
        super(_name, _color);
    }

    @Override
    void getInfo() {
        System.out.println("汽车品牌:" + this.name + " ,汽车颜色: " + this.color);
    }
}

// 简单工厂类

class SimpleCarFactory{

      /**
      * carName: 车名称
      * color: 车的颜色
      * type: 汽车品牌
      */
    @Override
    public Car getCar(String carName, String color, String type) {  // 参数化工厂方法: 根据传入的参数创建不同的对象
        if("Benz".equals(type)){
            return new BenzCar(carName, color);
        }else if ("BMW".equals(type)){
            return new BMWCar(carName, color);
        }else{
            System.out.println("No matching type!");
            return null;
        }
    }
}

public class FactoryPatterDemoSpace {
    public static void main(String[] args) {
        SimpleCarFactory carFactory = new SimpleCarFactory();
        Car car = carFactory.getCar("奔驰", "黑色", "Benz");
        car.getInfo(); // 汽车品牌:奔驰 ,汽车颜色: 黑色
    }
}

实例02:汽车工厂(工厂方法模式)

类图

技术分享图片

实例代码

// 产品类
abstract class Car{
    public String name; // 汽车名称
    public String color; // 汽车颜色

    Car(String _name, String _color){
        this.name = _name;
        this.color = _color;
    }
    abstract void getInfo();
}
// 产品具体类
class BenzCarInGermany extends Car{

    public BenzCarInGermany(String _name, String _color){
        super(_name, _color);
    }

    @Override
    void getInfo() {
        System.out.println("汽车名称:" + this.name
                + " ,汽车颜色: " + this.color
                + " ,汽车配置来源:德国????-Germany");
    }

}
// 产品具体类
class BenzCarInChina extends Car{

    public BenzCarInChina(String _name, String _color){
        super(_name, _color);
    }

    @Override
    void getInfo() {
        System.out.println("汽车名称:" + this.name
                + " ,汽车颜色: " + this.color
                + " ,汽车配置来源:中国????-China");
    }
}
// 产品具体类
class BMWCarInGermany extends Car{

    public BMWCarInGermany(String _name, String _color){
        super(_name, _color);
    }

    @Override
    void getInfo() {
        System.out.println("汽车名称:" + this.name
                + " ,汽车颜色: " + this.color
                + " , 汽车配置来源:德国????-Germany" );
    }
}
// 产品具体类
class BMWCarInChina extends Car{

    public BMWCarInChina(String _name, String _color){
        super(_name, _color);
    }

    @Override
    void getInfo() {
        System.out.println("汽车名称:" + this.name
                + " ,汽车颜色: " + this.color
                + " , 汽车配置来源:中国????-China" );
    }
}

// 工厂类
interface CarFactory{
    Car createCar(String carName, String color, String place);
}

// 工厂子类用来决定实例化对象的类具体是哪一个(工厂方法模式将类实例化延迟到子类)
class BenzCarFactory implements CarFactory{

    /**
     * @param carName 汽车名称
     * @param color 汽车颜色
     * @param place 汽车配置来源地
     * */
    @Override
    public Car createCar(String carName, String color, String place) {
        if("Germany".equals(place)){
            return new BenzCarInGermany(carName, color);
        }else if("China".equals(place)){
            return new BenzCarInChina(carName, color);
        }else{
            System.out.println("暂无!");
            return null;
        }
    }
}

public class FactoryPatterDemoSpace {
    public static void main(String[] args) {
        CarFactory carFactory = new BenzCarFactory();
        Car car01 = carFactory.createCar("奔驰233", "黑色", "China");
        car01.getInfo(); // 汽车名称:奔驰233 ,汽车颜色: 黑色 ,汽车配置来源:中国????-China
        Car car02 = carFactory.createCar("奔驰666", "蓝色", "Germany");
        car02.getInfo(); // 汽车名称:奔驰666 ,汽车颜色: 蓝色 ,汽车配置来源:德国????-Germany
    }
}

Factory pattern(工厂模式)

原文:https://www.cnblogs.com/openmind-ink/p/13593705.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!