工厂模式

80 阅读3分钟

工厂模式

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

简单工厂(静态工厂)

简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。
在简单工厂模式中,可以根据参数的不同返回不同类的实例。
简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

Factory:工厂类,简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

IProduct:抽象产品类,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

Product:具体产品类,是简单工厂模式的创建目标。

实例如下:

1.首先创建一个水果接口(抽象产品)

interface Fruit {

    name();
}

2.创建具体的产品,苹果和梨

class Apple implements Fruit {
    public name():void {
        console.log("我是苹果");
    }
}
class Pear implements Fruit{
    name():void {
        console.log("我是梨");
    }
}

3.创建产品工厂

//简单工厂,静态工厂
class SimpleFruitFactory {
    //第一种
    static Fruit getFruit(type: String) {

        if ("apple".equals(type)) {
            return new Apple();
        } else if ("pear".equals(type)) {
            return new Pear();
        }else {
            return null;
        }
    }

    //第二种
    static Fruit getApple(){
        return new Apple();
    }


    static Fruit getPear(){
        return new Pear();
    }

}

消费者使用

class Consumer {

        //每当我们水果的时候,需要自己new一个,相当于自己栽培
        //第一种,自己从头建造
        Apple apple = new Apple();
        Pear pear = new Pear();

        //从工厂中取
        //Apple apple2 = (Apple) SimpleFruitFactory.getApple();
       // Pear pear3 = (Pear) SimpleFruitFactory.getPear();

        Apple apple2 = (Apple) SimpleFruitFactory.getFruit("apple");
        Pear pear3 = (Pear) SimpleFruitFactory.getFruit("pear");
    }
}

image.png 总结:

  • 使用简单工厂可以帮助消费者直接创建产品的责任,实现了责任的分割,但存在的问题是,一但要增加新的产品,必须要修改工厂类,不符合oop的开闭原则。

工厂方法

  • 我们知道,开闭原则指的是对修改关闭,对扩展开放,而简单工厂就是为了解决这个问题,它提供一个工厂抽象接口,每一种产品的生产都会有自己的工厂,消费者从对应工厂获取产品即可,如果增加了一种产品,只需要增加对应的工厂即可,从而避免了修改,只是扩展。但是也会出现一个问题,那就是会出现大量的工厂类,代码量大。

image.png 1.新增工厂接口

//工厂方法
interface MethodFruitFactory {

    Fruit getFruit();

}

2.对应产品的工厂

class AppleFactory implements MethodFruitFactory {
    
    Apple getFruit() {
         return new Apple();
    }
}
class PearFactory implements  MethodFruitFactory{

    Pear getFruit() {
        return new Pear();
    }
}

3.消费者使用

class Consumer {

        //从对应工厂中获取
        Apple apple = new AppleFactory().getFruit();
        Pear pear = new PearFactory().getFruit();

       apple.name();
       pear.name();
    }
}

原文链接:blog.csdn.net/qq_34429554…