# 23种设计模式-工厂模式

# 工厂模式分为两类:工厂方法模式与抽象工厂模式。将简单工厂模式看为工厂方法模式的一种特例。

# 1.简单工厂模式

定义一个创建对象的接口,将对象的创建和本身的业务逻辑分离,降低系统的耦合度,使得两个修改起来相对容易些,当以后实现改变时,只需要修改工厂类即可。

# 优缺点

# 优点:

提供专门的工厂类用于创建对象,实现了对象创建和使用的职责分离。 客户端不需知道所创建的具体产品类的类名以及创建过程,只需知道具体产品类所对应的参数即可,通过引入配置文件, 可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

# 缺点:

在于不符合“开闭原则”,每次添加新产品就需要修改工厂类。 在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展维护,并且工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。

# 使用场景

# 实现方式

# 产品类

abstract class BMW {
    public BMW(){}
}

public class BMW320 extends BMW {
    public BMW320() {
        System.out.println("制造-->BMW320");
    }
}
public class BMW523 extends BMW{
    public BMW523(){
        System.out.println("制造-->BMW523");
    }
}

# 工厂类

public class Factory {
    public BMW createBMW(int type) {
        switch (type) {

            case 320:
                return new BMW320();

            case 523:
                return new BMW523();

            default:
                break;
        }
        return null;
    }
}

# 用户类

public class Customer {
    public static void main(String[] args) {
        Factory factory = new Factory();
        BMW bmw320 = factory.createBMW(320);
        BMW bmw523 = factory.createBMW(523);
    }
}

# 2.工厂方法模式

将工厂抽象化,定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延伸到其子类。 增加新产品,只需增加该产品以及对应的具体实现工厂类,由具体工厂类决定要实例化的产品是哪个,将对象的创建与实例化延迟到子类,这样工厂的设计就符合“开闭原则”了,扩展时不必去修改原来的代码

# 优缺点

# 优点:

不关心创建细节 符合开闭原则

# 缺点:

增加复杂性: 类的个数容易过多,增加系统复杂度 增加难度: 增加了系统抽象性和理解难度

# 使用场景

# 实现方式

# 产品类

abstract class BMW {
    public BMW(){}
}

public class BMW320 extends BMW {
    public BMW320() {
        System.out.println("制造-->BMW320");
    }
}
public class BMW523 extends BMW{
    public BMW523(){
        System.out.println("制造-->BMW523");
    }
}

# 工厂类

interface FactoryBMW {
    BMW createBMW();
}

public class FactoryBMW320 implements FactoryBMW{

    @Override
    public BMW320 createBMW() {
        return new BMW320();
    }

}
public class FactoryBMW523 implements FactoryBMW {
    @Override
    public BMW523 createBMW() {
        return new BMW523();
    }
}

# 用户类

public class Customer {
    public static void main(String[] args) {
        FactoryBMW320 factoryBMW320 = new FactoryBMW320();
        BMW320 bmw320 = factoryBMW320.createBMW();

        FactoryBMW523 factoryBMW523 = new FactoryBMW523();
        BMW523 bmw523 = factoryBMW523.createBMW();
    }
}

# 3.抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

# 优缺点

# 优点:

优点:

  1. 抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。

  2. 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

  3. 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

# 缺点:

  1. 抽象工厂模式将产品族的依赖与约束关系放到抽象工厂中,便于管理。
  2. 职责解耦,用户不需要关心一堆自己不关心的细节,由抽象工厂来负责组件的创建
  3. 切换产品族容易,只需要增加一个具体工厂实现,客户端选择另一个套餐就可以了

# 使用场景

# 实现方式

# 产品类

//发动机以及型号  
public interface Engine {}

public class EngineA implements Engine{
    public EngineA(){
        System.out.println("制造-->EngineA");
    }
}
public class EngineB implements Engine{
    public EngineB(){
        System.out.println("制造-->EngineB");
    }
}


//空调以及型号  
public interface Aircondition {}

public class AirconditionA implements Aircondition{
    public AirconditionA(){
        System.out.println("制造-->AirconditionA");
    }
}
public class AirconditionB implements Aircondition{
    public AirconditionB(){
        System.out.println("制造-->AirconditionB");
    }
} 

# 工厂类

//创建工厂的接口  
public interface AbstractFactory {
    //制造发动机
    public Engine createEngine();
    //制造空调 
    public Aircondition createAircondition();
}

//为宝马320系列生产配件  
public class FactoryBMW320 implements AbstractFactory{
    @Override
    public Engine createEngine() {
        return new EngineA();
    }
    @Override
    public Aircondition createAircondition() {
        return new AirconditionA();
    }
}
//宝马523系列
public class FactoryBMW523 implements AbstractFactory {
    @Override
    public Engine createEngine() {
        return new EngineB();
    }
    @Override
    public Aircondition createAircondition() {
        return new AirconditionB();
    }
}

# 用户类

public class Customer {
    public static void main(String[] args){
        //生产宝马320系列配件
        FactoryBMW320 factoryBMW320 = new FactoryBMW320();
        factoryBMW320.createEngine();
        factoryBMW320.createAircondition();

        //生产宝马523系列配件  
        FactoryBMW523 factoryBMW523 = new FactoryBMW523();
        factoryBMW523.createEngine();
        factoryBMW523.createAircondition();
    }
}

参考博客:https://blog.csdn.net/a745233700/article/details/120253639