设计模式:工厂设计模式

169 阅读4分钟

说明:只做学习用,有问题评论去指正!

是什么?

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

为什么用他?

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 工厂模式是为了解耦:把对象的创建和使用的过程分开。就是Class A 想调用 Class B ,那么A只是调用B的方法,而至于B的实例化,就交给工厂类。业务跟创建对象的解耦

一、传统创建bean

发现每创建一个对象就要new一次。如果层级太深,则需要new很多个对象

public class NoFactoryDemo {
    public static void main(String[] args) {
        BMW320 bmw320 = new BMW320();
        BMW325 bmw325 = new BMW325();
    }
}

class BMW320 {
    public BMW320() {
        System.out.println("==>>生产BMW320");
    }
}

class BMW325 {
    public BMW325() {
        System.out.println("==>>生产BMW325");
    }
}

二、简单工厂模式

这种工厂模式就是基于多态的工厂模式

public class SimpleFactoryDemo {

    public static void main(String[] args) {
        Car benz = SimpleFactory.createCar("Bmw");
    }

}

/**
 * 接口类
 * 抽象产品角色
 */
interface Car {

}

/**
 * 宝马
 * 具体产品类角色
 */
class Bmw implements Car {
    public Bmw() {
        System.out.println("===>>>建造Bmw");
    }
}

/**
 * 奔驰
 * 具体产品类角色
 */
class Benz implements Car {
    public Benz() {
        System.out.println("===>>>建造Benz");
    }
}

/**
 * 工厂类角色
 * 基于多态的方式
 */
class SimpleFactory {
    public static Car createCar(String type) {
        Car car = null;
        switch (type) {
            case "Bmw": {
                car = new Bmw();
            }break;
            case "Benz": {
                car = new Benz();
            }
        }
        return car;
    }
}

  1. ⼯⼚类⻆⾊:这是本模式的核⼼,含有⼀定的商业逻辑和判断逻辑,⽤来创建产品
  2. 抽象产品⻆⾊:它⼀般是具体产品继承的⽗类或者实现的接⼝。
  3. 具体产品⻆⾊:⼯⼚类所创建的对象就是此⻆⾊的实例。在java中由⼀个具体类实现。

简单工厂的优点/缺点:

优点: 简单工厂模式能够根据外界给定的信息,创建对应的对象。有利于整个软件体系结构的优化。

缺点: 很明显工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则

三、工厂方法模式

⼯⼚⽅法模式去掉了简单⼯⼚模式中⼯⼚⽅法的静态属性,使得它可以被⼦类继承。这样在简单⼯ ⼚模式⾥集中在⼯⼚⽅法上的压⼒可以由⼯⼚⽅法模式⾥不同的⼯⼚⼦类来分担。

public class FactoryMethodDemo {
    public static void main(String[] args) {
        FactoryMethodBmw factoryMethodBmw = new FactoryMethodBmw();
        Car bmwCar = factoryMethodBmw.createCar();
        FactoryMethodBenz factoryMethodBenz = new FactoryMethodBenz();
        Car benzCar = factoryMethodBenz.createCar();
    }
}

/**
 * 接口类
 * 抽象产品
 */
interface Car {

}

/**
 * 宝马
 */
class Bmw implements Car {
    public Bmw() {
        System.out.println("===>>>建造Bmw");
    }
}

/**
 * 奔驰
 */
class Benz implements Car {
    public Benz() {
        System.out.println("===>>>建造Benz");
    }
}

/**
 * 抽象工厂角色
 */
interface FactoryMethod {
    Car createCar();
}

/**
 * 宝马工厂类
 * 具体工厂类
 */
class FactoryMethodBmw implements FactoryMethod {

    @Override
    public Car createCar() {
        return new Bmw();
    }
}

/**
 * 奔驰工厂类
 * 具体工厂类
 */
class FactoryMethodBenz implements FactoryMethod {

    @Override
    public Car createCar() {
        return new Benz();
    }
}

⼯⼚⽅法模式组成:

  1. 抽象⼯⼚⻆⾊: 这是⼯⼚⽅法模式的核⼼,它与应⽤程序⽆关。是具体⼯⼚⻆⾊必须实现的接⼝或 者必须继承的⽗类。在java中它由抽象类或者接⼝来实现。

  2. 具体⼯⼚⻆⾊:它含有和具体业务逻辑有关的代码。由应⽤程序调⽤以创建对应的具体产品的对象。

  3. 抽象产品⻆⾊:它是具体产品继承的⽗类或者是实现的接⼝。在java中⼀般有抽象类或者接⼝来实 现。

  4. 具体产品⻆⾊:具体⼯⼚⻆⾊所创建的对象就是此⻆⾊的实例。在java中由具体的类来实现。 (开闭原则)当有新的产品产⽣时,只要按照抽象产品⻆⾊、抽象⼯⼚⻆⾊提供的合同来⽣成,那么 就可以被客户使⽤,⽽不必去修改任何已有 的代码。

优点:

  1. 相对简单工厂模式,工厂方法模式扩展只需要再实现抽象工厂接口。即可实现新的工厂而无需修改旧代码。而简单工厂模式则需要修改创建逻辑处加个case。

  2. 典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不需要关心,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。

缺点:

  1. 如果添加键盘产品,就需要添加键盘工厂类。假如我们要实现的产品接口不止一个,也就是有多个产品接口,不同产品接口有对应的产品族。什么是产品族呢?简单的理解就是,不同厂家的不仅有鼠标,还有键盘,音响,笔记本可以组成一个产品族。对于这种情况我们可以采用抽象工厂模式

四、抽象工厂模式:

待补充