23种设计模式——工厂模式

23种设计模式——工厂模式

作用

实现了创建者和调用者分离

详细分类

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

核心本质

  • 实例化对象不使用new,用工厂方法代替

  • 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦

1)简单工厂(静态工厂模式)

虽然某种程度上不符合设计原则,但实际用的最多

package com.mjh.factory.simple;

public interface Car {
    void name();
}
package com.mjh.factory.simple;

public class AoDi implements Car {
    @Override
    public void name() {
        System.out.println("奥迪");
    }
}
package com.mjh.factory.simple;

public class TesLa implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}
package com.mjh.factory.simple;

//静态工厂模式
//增加一个新产品,如果你不修改代码,做不到的

//开闭原则
public class CarFactory {
    public static Car getCar(String car){

        //方法一
        if(car.equals("奥迪")){
            return new AoDi();
        }else  if(car.equals("特斯拉")){
            return new TesLa();
        }else {
            return null;
        }
    }

    //方法二
    public  static Car getAoDi(){
        return new AoDi();
    }
    public  static Car getTesLa(){
        return new TesLa();
    }

}
package com.mjh.factory.simple;

public class Impl {
    public static void main(String[] args) {
       /* Car car = new AoDi();
        Car car1 = new TesLa();  不用new创建了,只需创建一个工厂*/

       //使用工厂创建
        Car car = CarFactory.getCar("奥迪");
        Car car1= CarFactory.getCar("特斯拉");
        car.name();
        car1.name();

    }
}

2)工厂方法模式

不修改已有的类的前提下,通过增加新的工厂实现扩展

package com.mjh.factory.method;

public interface Car {
    void name();
}
package com.mjh.factory.method;

public interface CarFactory {
    Car getCar();
}
package com.mjh.factory.method;

public class AoDi implements Car {
    @Override
    public void name() {
        System.out.println("奥迪");
    }
}
package com.mjh.factory.method;

public class AoDiFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new AoDi();
    }
}
package com.mjh.factory.method;

public class Impl {
    public static void main(String[] args) {
        Car car = new AoDiFactory().getCar();
        Car car1 = new TesLaFactory().getCar();
        car.name();
        car1.name();
    }
}

两种方式的对比

结构复杂度:简单工厂方法

代码复杂度:简单工厂方法

编程复杂度:简单工厂方法

管理上的复杂度:简单工厂方法

根据设计原则:工厂方法模式

根据实际业务:简单工厂模式

原文地址:https://www.cnblogs.com/mjjh/p/13296056.html