简述设计模式-工厂模式

概述

工厂模式是为了提供创建对象的方式,无需制定要创建的具体类。

举个例子,假如我是甲方需要制造一辆车,我可以要油车,可以要电车,也可以油电混动车,如果没有工厂,我需要自己找到对应的制造车的方法来制造。

但是有了工厂之后,我不用直接去找对应类型的车的制造方法,我直接告诉工厂我需要什么类型的车,工厂就可以帮助我制造出我想要类型的车。

简单来说,我不用关注工厂是怎么造车的,我只管问工厂要就行了。

工厂模式又包括工厂方法模式,抽象工厂模式,抽象工厂模式实际像是工厂方法模式的PLUS版本,或者像是套娃版本?抽象工厂相当于将工厂作为一个产品,用户可以选择不同的工厂来定义产品的不同属性。

应用场景

当我们不知道选择哪个接口来创建实例,或者需要在不同条件下创建不同实例时。

优点

调用者只需要知道需要创建的对象的名称即可告诉工厂类进行对象的创建。

缺点

每当增加产品,都需要新增一个工厂类和具体实现类,过多造成类爆炸,系统复杂度就高了。

应用实例

E-R图

代码

  1. 制造汽车接口
java 复制代码
public interface Car {
    //创造汽车的抽象方法
    void create();
}
  1. 汽车具体实现类,包括油车,电车,混动
java 复制代码
public class OilCar implements Car {
    @Override
    public void create() {
        System.out.println("制造油车");
    }
}
java 复制代码
public class ElecCar implements Car {
    @Override
    public void create() {
        System.out.println("制造电车");
    }
}
java 复制代码
public class MixCar implements Car {
    @Override
    public void create() {
        System.out.println("制造油电混动车");
    }
}
  1. 工厂类
java 复制代码
public class CarFactory {
    //通过判断传入的参数来决定生产什么类型的汽车
    public Car createCar(String type){
        if("油车".equals(type)){
            return new OilCar();
        }
        if("电车".equals(type)){
            return new ElecCar();
        }
        if("混动车".equals(type)){
            return new MixCar();
        }
        return null;
    }
}
  1. 调用方法
java 复制代码
public class main {
    public static void main(String[] args) {
        //创建工厂对象
        CarFactory carFactory = new CarFactory();
        //创建汽车对象
        Car car1 = carFactory.createCar("油车");
        Car car2 = carFactory.createCar("电车");
        Car car3 = carFactory.createCar("混动车");
        //创建汽车
        car1.create();
        car2.create();
        car3.create();
    }
}

抽象工厂方法

E-R图

代码

  1. 抽象工厂类
java 复制代码
public abstract class AbstractFactory {
    public abstract Car createCar(String Car);
    public abstract Color createColor( String Color);
}
  1. 工厂实现类
java 复制代码
public class CarFactory extends AbstractFactory {
    //通过判断传入的参数来决定生产什么类型的汽车
    public Car createCar(String type){
        if("油车".equals(type)){
            return new OilCar();
        }
        if("电车".equals(type)){
            return new ElecCar();
        }
        if("混动车".equals(type)){
            return new MixCar();
        }
        return null;
    }

    @Override
    public Color createColor(String Color) {
        return null;
    }
}
javascript 复制代码
public class ColorFactory extends AbstractFactory {
    @Override
    public Car createCar(String Car) {
        return null;
    }
    //通过判断传入的参数来决定生产什么类型的汽车
    public Color createColor(String type){
        if("红色".equals(type)){
            return new Red();
        }
        if("黄色".equals(type)){
            return new Yellow();
        }
        if("蓝色".equals(type)){
            return new Blue();
        }
        return null;
    }
}
  1. 产品抽象类和实现类
java 复制代码
//汽车接口类
public interface Car {
    //创造汽车的抽象方法
    void createCar();
}

//汽车实现类
public class OilCar implements Car {
    @Override
    public void createCar() {
        System.out.println("制造油车");
    }
}
public class ElecCar implements Car {
    @Override
    public void createCar() {
        System.out.println("制造电车");
    }
}
public class MixCar implements Car {
    @Override
    public void createCar() {
        System.out.println("制造油电混动车");
    }
}
java 复制代码
//颜色接口类
public interface Color {
    void createColor();
}
public class Red implements Color{
    @Override
    public void createColor() {
        System.out.println("红色");
    }
}
public class Yellow implements Color{
    @Override
    public void createColor() {
        System.out.println("黄色");
    }
}
public class Blue implements Color{
    @Override
    public void createColor() {
        System.out.println("蓝色");
    }
}
  1. 选择工厂对应的工厂
java 复制代码
public class FactoryProducer {
    public static AbstractFactory getFactory(String choice){
        if(choice.equalsIgnoreCase("汽车")){
            return new CarFactory();
        } else if(choice.equalsIgnoreCase("颜色")){
            return new ColorFactory();
        }
        return null;
    }
}
  1. 主类调用
java 复制代码
public class main {
    public static void main(String[] args) {
        //创建汽车工厂
        AbstractFactory carFactory = FactoryProducer.getFactory("汽车");
        Car oilCar = null;
        if (carFactory != null) {
            oilCar = carFactory.createCar("油车");
        }
        if (oilCar != null) {
            oilCar.createCar();
        }
        //创建颜色工厂
        AbstractFactory colorFactory = FactoryProducer.getFactory("颜色");
        Color redColor = null;
        if (colorFactory != null) {
            redColor = colorFactory.createColor("红色");
        }
        if (redColor != null) {
            redColor.createColor();
        }
    }
}
相关推荐
BD_Marathon2 天前
工厂方法模式
android·java·工厂方法模式
青春易逝丶3 天前
工厂方法模式
工厂方法模式
阿闽ooo3 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4963 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃3 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式
驴儿响叮当20103 天前
设计模式之状态模式
设计模式·状态模式
电子科技圈3 天前
XMOS推动智能音频等媒体处理技术从嵌入式系统转向全新边缘计算
人工智能·mcu·物联网·设计模式·音视频·边缘计算·iot
徐先生 @_@|||3 天前
安装依赖三方exe/msi的软件设计模式
设计模式
希望_睿智4 天前
实战设计模式之访问者模式
c++·设计模式·架构
茶本无香4 天前
设计模式之十六:状态模式(State Pattern)详解 -优雅地管理对象状态,告别繁琐的条件判断
java·设计模式·状态模式