设计模式-工厂模式

标签: 设计模式  工厂方法模式  抽象工厂模式  java

设计模式-工厂模式

1 简单工厂模式

1.1 介绍

工厂类通过create(String type)方法,通过传递不同的参数,创建不同的产品类。

1.2 UML类图

在这里插入图片描述

1.3 优缺点

优点:简单粗暴,在一个工厂中可以创建任何产品类。
缺点:没有遵循开闭原则,在新增新产品的基础上,必须修改原有的代码。在后续的迭代中,扩展性低。

1.4 示例

  1. 接口类interface Product
public interface Product {
    void operation1();
    void operation2();
}

  1. 产品类class ProductA
public class ProductA implements Product {
    @Override
    public void operation1() {
        System.out.println("operation1 " + "ProductA");
    }

    @Override
    public void operation2() {
        System.out.println("operation2 " + "ProductA");
    }
}

  1. 产品类class ProductA
public class ProductB implements Product {
    @Override
    public void operation1() {
        System.out.println("operation1 " + "ProductB");
    }

    @Override
    public void operation2() {
        System.out.println("operation2 " + "ProductB");
    }

}
  1. client
public class Client {

    public static void main(String[] args) {
        ProductFactory productFactory = new ProductFactory();
        Product productA = productFactory.create("A");
        Product productB = productFactory.create("B");
        productA.operation1();
        productA.operation2();
        productB.operation1();
        productB.operation2();
    }
}

输出

operation1 ProductA
operation2 ProductA
operation1 ProductB
operation2 ProductB]

2 工厂方法模式

2.1 介绍

工厂方法模式,是针对每一种产品,提供一个工厂类。通过不同的工厂实例创建不同的产品实例。

2.2 UML类图

在这里插入图片描述

2.3 优缺点

  • 优点:工厂方法很好的减轻的单个工厂的负担,把每一类产品交由特定的工厂创建;同时新增产品,只需要新增对应的工厂类,无需修改之前的代码,遵循开闭原则。
  • 缺点:对于某些可能形成产品族的场景,处理比较复杂。

2.4 示例

  1. 对原来的代码进行改造ProductFactory
public interface ProductFactory {
    Product create();
}
  1. ProductA 工厂ProductAFactory
public class ProductAFactory implements ProductFactory {
    @Override
    public Product create() {
        return new ProductA();
    }
}
  1. ProductB 工厂ProductBFactory
public class ProductBFactory implements ProductFactory {
    @Override
    public Product create() {
        return new ProductB();
    }
}
  1. client
public class Client {

    public static void main(String[] args) {
        ProductAFactory aFactory = new ProductAFactory();
        ProductBFactory bFactory = new ProductBFactory();

        Product productA = aFactory.create();
        Product productB = bFactory.create();
        productA.operation1();
        productA.operation2();
        productB.operation1();
        productB.operation2();
    }
}

输出

operation1 ProductA
operation2 ProductA
operation1 ProductB
operation2 ProductB

4 抽象工厂模式

4.1 介绍

抽象工厂应对的是产品族的概率。上述的工厂只负责生产固定的产品,抽象方法适用于生产一个族系的产品。

4.2 UML类图

在这里插入图片描述

4.3 工厂模式间的区别

  1. 简单工厂:用于生产同一级别结构的任意商品。
  2. 工厂方法:用于生产同一级别结构的固定商品。
  3. 抽象工厂:用于生产同一产品族的全部产品。

4.4 示例

汽车分为:轿车,SUV等系列车型,也分为奔驰,宝马等品牌。以下的示例代码为奔驰工厂奔驰系列产品,宝马工厂生产宝马系列产品。

  1. interface CarSuv
public interface CarSuv {
    void operation1();
}
  1. class BenzCarSuv
public class BenzCarSuv implements CarSuv {
    @Override
    public void operation1() {
        System.out.println("奔驰Benz SUV operation");
    }
}
  1. class BwmCarSuv
public class BwmCarSuv implements CarSuv {
    @Override
    public void operation1() {
        System.out.println("Bwm SUV operation");
    }
}
  1. interface CarSedan
public interface CarSedan {

    void operation1();
}
  1. class BenzCarSendan
public class BenzCarSendan implements CarSedan {

    @Override
    public void operation1() {
        System.out.println("奔驰Benz 轿车 operation");
    }
}
  1. class BwmCarSedan
public class BwmCarSedan implements CarSedan {

    @Override
    public void operation1() {
        System.out.println("BWM 轿车 operation");
    }
}
  1. interface CarFactory
public interface CarFactory {

    CarSuv createCarSuv();

    CarSedan creatCarSedan();
}
  1. class BwmCarFactory
public class BwmCarFactory implements CarFactory {
    @Override
    public CarSuv createCarSuv() {
        return new BwmCarSuv();
    }

    @Override
    public CarSedan creatCarSedan() {
        return new BwmCarSedan();
    }
}
  1. class BenzCarFactory
public class BenzCarFactory implements CarFactory {

    @Override
    public CarSuv createCarSuv() {
        return new BenzCarSuv();
    }

    @Override
    public CarSedan creatCarSedan() {
        return new BenzCarSendan();
    }
}
  1. client
public class Client {

    public static void main(String[] args) {
        BenzCarFactory benzCarFactory = new BenzCarFactory();
        BwmCarFactory bwmCarFactory = new BwmCarFactory();
        CarSuv benzCarSuv = benzCarFactory.createCarSuv();
        CarSedan benzCarSedan = benzCarFactory.creatCarSedan();
        CarSuv bwmCarSuv = bwmCarFactory.createCarSuv();
        CarSedan bwmCarSedan = bwmCarFactory.creatCarSedan();
        benzCarSuv.operation1();
        benzCarSedan.operation1();
        bwmCarSuv.operation1();
        bwmCarSedan.operation1();
    }
}

输出

奔驰Benz SUV operation
奔驰Benz 轿车 operation
Bwm SUV operation
BWM 轿车 operation
版权声明:本文为qq_27242695原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_27242695/article/details/109503653

智能推荐

使用Xdebug进行远程调试

为什么要用? 方便联调: 和客户端一起联调,是die(); exit(); 会影响其他人员是使用。 关注数据变化: 正常情况下,我们在调试和开发时,更关注数据的变化。频繁断点、效率比较低。 简单: 之前的开发自己比较懒,一直没用,用起来发现很简单。 原理 运行xdebug需要客户端IDE(phpstorm)、远程服务器配合,首先是客户端配置好端口,发送debug请求,请求会通过浏览器或者IDE的h...

【教程向】通过windows在树莓派3B上安装Ubuntu MATE 16.04.2 (Xenial)

本文参考了http://www.ituring.com.cn/article/273613 ================================================================= 1:因为树莓派3B的性能问题,所以使用这个特别为树莓派设计的版本。 2:准备: 树莓派3B * 1 16GB TF/Micro SD卡 *1(尽量用速度快一些的卡,因为以后这相...

LeetCode(7 整数反转)

如题 这就不用分析了,直接依次取每位即可,难点就是个越界判断...

Caused by: java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception

启动RMI报如下错误: 最后发现是端口冲突造成的,当时用的5003端口启动服务端的RMI刚好和本地的一个服务端口冲突。 输入netstat -aon|findstr "5003"查询它的pid为3056 继续输入tasklist|findstr "3056",查看是哪个进程或者程序占用了5003端口,结果是:magentproc.exe 找到PID后可以直接...

猜你喜欢

【LeetCode(Java) - 322】零钱兑换

文章目录 1、题目描述 2、解题思路 3、解题代码 1、题目描述 2、解题思路   定义 dp[i] 表示对于组成金额 i 的最少硬币个数。   如果方案存在,那么至少有一个硬币至少出现了一次:   如果是第 0 个硬币出现了一次,则:dp[i] = dp[i-coins[0]] + 1   如果是第 1 个硬币出现了...

在Visual Studio 2013中配置Entity Framework使用MySQL

环境 使用的软件及版本 - Microsoft Visual Studio Ultimate 2013 (版本 12.0.40629.00 Update 5) - Microsoft.Net Framework 版本 4.6.01055 - MySQL版本: 5.6.17 步骤 1. 创建空的MVC项目 2. 安装扩展 3. 在数据库中建立对应的表 必须在数据库内先新建表,否则asp.net mv...

Python才是世界上最好的言语,php,java靠边站

伟大的入门编程语言有什么特征呢?或者换一种方式问,“当我们教他们编程时,应该给予他们什么?”对于成年人和青少年学生,我认为以下五点非常重要。 学生从入门语言获得的五样东西 非常棒的首次体验,就像一本书的第一页,首先需要“入迷”,学习新知识不可避免的会遇到挫折,但要有持续的热情和好奇心,这对于那些从未接触过编码的年轻人来说是至关重要的; Web编程的能...

动态调整docker容器cpu资源

目的:动态调整系统cpu核数后,如何在不停止容器服务的情况下,docker动态使用最新的CPU资源 事件由来:     1、在ucloud上购买了一台可以热升级的机器,热升级指的是动态更改系统cpu和内存资源     2、随着业务的扩展,发现cpu、内存负载过高,需要在不停止业务的情况下动态扩容,因此使用了ucloud提供的热升级服务,从4核12G扩容为8核...

用python itchat包 爬取微信好友头像形成矩形头像集

原创作品,转载请注明作者 abysscarry-袁杰丶 初学python,我们必须干点有意思的事!从微信下手吧! 头像集样例如下: 大家可以发朋友圈开启辨认大赛哈哈~ 话不多说,直接上代码,注释我写了比较多,大家应该能看懂 运行结果: ok!!!...