首页 > 其他分享 >工厂模式(factory)

工厂模式(factory)

时间:2023-01-31 22:22:13浏览次数:40  
标签:demo void factory 模式 工厂 Car public

1,简单工厂模式

1.1,简介

简单工厂:封装创建产品的过程。提供一个返回产品实例的方法,此方法封装了产品实例的逻辑,根据参数返回不同的实例。所有产品一个工厂实例生成。

缺点:每多一个产品,就要修改 instance() 方法,修改的多,方法就变长。

优点:我就是这么用的,简单实用。。。

简单工厂模式不属于 23 种设计模式之一。

1.2,demo

  1. 产品接口
package com.demo.base.design_partten.factory.simple_factory;

/**
 * 产品接口
 * */
public interface Car {

    void run();

    void stop();
}

  1. 产品类
package com.demo.base.design_partten.factory.simple_factory;

/**
 * 产品类
 * */
public class BCCar implements Car {
    @Override
    public void run() {
        System.out.println("bc car is running");
    }

    @Override
    public void stop() {
        System.out.println("bc car is stop");
    }
}

package com.demo.base.design_partten.factory.simple_factory;

/**
 * 产品类
 * */
public class BMCar implements Car {
    @Override
    public void run() {
        System.out.println("bm car is running");
    }

    @Override
    public void stop() {
        System.out.println("bm car is stop");
    }
}

  1. 工厂类

封装创建产品对象的方法。

package com.demo.base.design_partten.factory.simple_factory;

/**
 * @author gx
 * 简单工厂:
 *  封装创建产品的过程。提供一个返回产品实例的方法,此方法封装了产品实例的逻辑,根据参数返回不同的实例。所有产品一个工厂实例生成。
 * 缺点:
 *  每多一个产品,就要修改 instance() 方法,修改的多,方法就变长。
 * 优点:
 *  我就是这么用的,简单实用。。。
 */
public class Factory {
    public static Car instance(Integer carType) throws Exception {
        if(carType.equals(1)){
            return new BCCar();
        }else if(carType.equals(2)){
            return new BMCar();
        }else{
            throw new Exception();
        }
    }
}

  1. 测试类

调用工厂类提供的方法来创建产品对象。

package com.demo.base.design_partten.factory.simple_factory;

/**
 * 简单工厂模式不算 GOF 23 种设计模式之一。
 * GOF:一本书四个人写的关于设计模式的书(Gang of Four)
 * 调用工厂类的方法,传入参数获取不同的实例。
 * */
public class Test {
    public static void main(String[] args) throws Exception {
        Car instance = Factory.instance(1);
        instance.run();
        instance.stop();

        Car instance1 = Factory.instance(2);
        instance1.run();
        instance1.stop();
    }
}

2,抽象工厂模式

2.1,简介

抽象工厂模式

GOF 之一。符合开闭原则。

同一个工厂创建一系列的产品(车,座椅)。不违反开闭原则情况下,智能扩展一个新的系列(大众)。

抽象工厂模式和工厂方法模式:抽象工厂每个工厂可以创建一个系列的多个不同实例,工厂方法只能创建一个实例。

2.2,demo

  1. 产品接口
package com.demo.base.design_partten.factory.abstract_factory;

public interface Seat {
    void sit();
}

package com.demo.base.design_partten.factory.abstract_factory;

/**
 * 产品接口
 * */
public interface Car {

    void run();

    void stop();
}

  1. 产品实现类
package com.demo.base.design_partten.factory.abstract_factory;

/**
 * 产品类
 * */
public class BCCar implements Car {
    @Override
    public void run() {
        System.out.println("bc car is running");
    }

    @Override
    public void stop() {
        System.out.println("bc car is stop");
    }
}

package com.demo.base.design_partten.factory.abstract_factory;

/**
 * 产品类
 * */
public class BMCar implements Car {
    @Override
    public void run() {
        System.out.println("bm car is running");
    }

    @Override
    public void stop() {
        System.out.println("bm car is stop");
    }
}

package com.demo.base.design_partten.factory.abstract_factory;

public class BCSeat implements Seat {
    @Override
    public void sit() {
        System.out.println("bc sit!");
    }
}

package com.demo.base.design_partten.factory.abstract_factory;

public class BMSeat implements Seat {
    @Override
    public void sit() {
        System.out.println("BM sit!");
    }
}

  1. 抽象工厂
package com.demo.base.design_partten.factory.abstract_factory;

public interface AbstractFactory {
    Car createCar();

    Seat createSeat();
}

  1. 工厂类
package com.demo.base.design_partten.factory.abstract_factory;

public class BCFactory implements AbstractFactory {
    @Override
    public Car createCar() {
        return new BCCar();
    }

    @Override
    public Seat createSeat() {
        return new BCSeat();
    }
}

package com.demo.base.design_partten.factory.abstract_factory;

public class BMFactory implements AbstractFactory{
    @Override
    public Car createCar() {
        return new BMCar();
    }

    @Override
    public Seat createSeat() {
        return new BMSeat();
    }
}

  1. 测试类
package com.demo.base.design_partten.factory.abstract_factory;

public class Test {
    public static void main(String[] args) {
        BMFactory bmFactory = new BMFactory();
        Car bmCar = bmFactory.createCar();
        bmCar.run();
        bmCar.stop();
        Seat bmSeat = bmFactory.createSeat();
        bmSeat.sit();

        BCFactory bcFactory = new BCFactory();
        Car bcCar = bcFactory.createCar();
        bcCar.run();
        bcCar.stop();
        Seat bcSeat = bcFactory.createSeat();
        bcSeat.sit();
    }
}

3. 工厂方法模式

3.1,简介

工厂方法模式:属于 GOF 23种设计模式之一。符合开放封闭原则。

开放封闭原则:
 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
 对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。

每个产品一个对应的工厂,新增一种产品,需要新增一个工厂,不需要修改之前的产品和工厂类。

3.2,demo

  1. 产品接口
package com.demo.base.design_partten.factory.method_factory;

/**
 * 产品接口
 * */
public interface Car {

    void run();

    void stop();
}

  1. 产品实现类
package com.demo.base.design_partten.factory.method_factory;

/**
 * 产品类
 * */
public class BCCar implements Car {
    @Override
    public void run() {
        System.out.println("bc car is running");
    }

    @Override
    public void stop() {
        System.out.println("bc car is stop");
    }
}

package com.demo.base.design_partten.factory.method_factory;

/**
 * 产品类
 * */
public class BMCar implements Car {
    @Override
    public void run() {
        System.out.println("bm car is running");
    }

    @Override
    public void stop() {
        System.out.println("bm car is stop");
    }
}

package com.demo.base.design_partten.factory.method_factory;

public class DzCar implements Car {
    @Override
    public void run() {
        System.out.println("dz car is running");
    }

    @Override
    public void stop() {
        System.out.println("dz car is stop");
    }
}

  1. 抽象工厂
package com.demo.base.design_partten.factory.method_factory;

/**
 * 抽象工厂
 * */
public interface AbstractFactory {
    Car createCar();
}

  1. 工厂实现类
package com.demo.base.design_partten.factory.method_factory;

public class BCFactory implements AbstractFactory {
    @Override
    public Car createCar() {
        return new BCCar();
    }
}

package com.demo.base.design_partten.factory.method_factory;

/**
 * @author gx
 */
public class BMFactory implements AbstractFactory {
    @Override
    public Car createCar() {
        return new BMCar();
    }
}

package com.demo.base.design_partten.factory.method_factory;

public class DzFactory implements AbstractFactory{
    @Override
    public Car createCar() {
        return new DzCar();
    }
}

  1. 测试类
package com.demo.base.design_partten.factory.method_factory;

/**
 * 工厂方法模式:
 *  属于 GOF 23种设计模式之一。符合开放封闭原则。
 *  开放封闭原则:
 *      对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
 *      对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
 * 每个产品一个对应的工厂,新增一种产品,需要新增一个工厂,不需要修改之前的产品和工厂类。
 * */
public class Test {
    public static void main(String[] args) {

        Car car = new BMFactory().createCar();
        car.run();
        car.stop();

        Car car1 = new BCFactory().createCar();
        car1.run();
        car1.stop();

        Car car2 = new DzFactory().createCar();
        car2.run();
        car2.stop();

    }
}

4. 工厂方法模式和抽象工厂模式的区别

工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。

区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

标签:demo,void,factory,模式,工厂,Car,public
From: https://www.cnblogs.com/cnff/p/17080950.html

相关文章

  • 代理模式(Proxy)
    1,代理模式代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代......
  • dremio provisioning 几种模式简单介绍
    主要是包含了基于云以及yarn模式的部署awseks  azurearm  azureaks  yarn模式  标准集群模式  说明以上集中模式包含了软件以及在云......
  • RabbitMQ基本原理及模式介绍
    一、RabbitMQ概念RabbitMQ:是一个由erlang开发的AMQP(AdvancedMessageQueue高级消息队列协议)的开源实现,由于erlang语言的高并发特性,性能较好,本质是个队列,FIFO先入先......
  • 通过自定义注解和反射实现策略模式
    通过自定义注解和反射实现策略模式​ 今天在写一个工单系统时,工单审批通过后,需要根据不同的工单类型选择不同的处理方式非常适合用自定义注解+反射来实现,研究了一番,......
  • Web应用模式 Api接口 Api接口调试工具postman及使用
    目录web应用模式前后端混合开发前后端分离开发API接口接口调试工具postmanpostman的使用web应用模式前后端混合开发djangoweb框架专门用来写web项目#之前学的,写的bbs......
  • 0161-GDB 调试实模式
    环境Time2022-11-08WSL-Ubuntu22.04QEMU6.2.0NASM2.15.05前言说明参考:《x86汇编语言:从实模式到保护模式》李忠参考:https://astralvx.com/debugging-16-bit-......
  • vue 不同路由模式,部署时,nginx的不同配置
    hash模式路由配置如下:location/{rootfont;indexindex.htmlindex.htm;}history模式路由配置如下:location/{rootfont;index......
  • Vulnhub之Cheran EE靶机详细测试过程(需要特别注意靶机的网络模式)
    CheranEE靶机信息名称:Cheran:1地址:https://www.vulnhub.com/entry/cheran-1,521/识别目标主机IP地址(kali㉿kali)-[~/Vulnhub/Cheran]└─$sudonetdiscover-i......
  • nginx部署vue history模式项目页面刷新报404问题
    nginx部署vuehistory模式项目页面刷新报404问题解决方案:在nginx配置种添加以下代码:try_files$uri$uri//index.html示例:location/{rootdist;......
  • 委派模式——从SLF4J说起
    作者:vivo互联网服务器团队-Xiongyangxin将某个通用解决方案包装成成熟的工具包,是每一个技术建设工作者必须思考且必须解决的问题。本文从业内流行的既有工具包入手,解......