十分钟学完简单工厂,普通工厂,抽象工厂
创始人
2024-02-24 15:18:15
0

快速学习简单工厂,普通工厂,抽象工厂

  • 前言:产品等级和产品族
    • 工厂模式作用
    • 简单工厂模式
      • uml
      • 代码
      • 优缺点
    • 普通工厂模式
      • uml
      • 代码
      • 优缺点
    • 抽象工厂模式
      • uml
      • 代码
      • 优缺点

前言:产品等级和产品族

在学习工厂模式之前,先得了解一下产品等级和产品族的概念。
产品等级:不同品牌的同一产品处于同一产品等级
产品族:同一品牌的不同产品 处于同一产品族
比如华为平板,小米平板,苹果平板处于同一产品等级。
比如华为平板,华为手机,华为电脑处于同一产品族。

在这里插入图片描述

工厂模式作用

当数据源或者对象的创建比较复杂时,可以考虑采用工厂模式。

简单工厂模式

简单工厂模式很简单,一般只有一个产品等级。
比如只生产手机:苹果手机,华为手机这类的

uml

在这里插入图片描述
简单工厂模式很简单,就三步
1.创建一个产品接口(手机)
2.对该接口实现(华为手机,苹果手机)
3.写一个工厂类,用来生成对应的手机,一般提供一个静态方法,方法只有一个入参,用来选择生成的手机是什么牌子的。

代码

//1.创建一个产品接口(手机)
public interface Phone{void show();
}//对该接口实现(华为手机,苹果手机)
public class HuaWeiPhone implements Phone{@Overridepublic void show(){System.out.println("生产了一部华为手机");}
}public class PingGuoPhone implements Phone{@Overridepublic void show(){System.out.println("生产了一部苹果手机");}
}//写一个工厂类,用来生成对应的手机
public class PhoneFactory{// 法一:public static Phone createPhone(String brand){Phone phone = null;Switch(brand){case "Apple" :phone = new PingGuoPhone();break;case "HuaWei" :phone = new HuaWeiPhone ();break;default:break;}return phone;}// 法二:public static  T createPhone(Class clz){Phone phone = null;try{phone = clz.newInstance();} catch(InstantiationException e){e.printStackTrace();} catch(IllegalAccessException e){e.printStackTrace();}return (T) iceCream;}
}

优缺点

一般来说简单工厂类是法一的写法,此时如果你加一个小米手机,你得先实现phone接口,这个没问题,但是你还得把工厂里面的createPhone方法改写,不符合开闭原则。法二不存在问题。
此外工厂类负责了所有产品的实例化,违反了单一原则。法一和法二都有问题

普通工厂模式

在简单工厂模式上稍作修改,对工厂进行抽象

uml

在这里插入图片描述
相比较简单工厂模式,对工厂进行了抽象。

代码

//1.创建一个产品接口(手机)
public interface Phone{void show();
}//对该接口实现(华为手机,苹果手机)
public class HuaWeiPhone implements Phone{@Overridepublic void show(){System.out.println("生产了一部华为手机");}
}public class PingGuoPhone implements Phone{@Overridepublic void show(){System.out.println("生产了一部苹果手机");}
}//创建工厂接口
public interface PhoneFactory{public Phone createPhone();
}
//对该接口实现(华为手机工厂,苹果手机工厂)
public class PingGuoPhoneFactory implements PhoneFactory{@Overridepublic Phone createPhone(){return new PingGuoPhone();}
}public class HuaWeiPhoneFactory implements PhoneFactory{@Overridepublic Phone createPhone(){return new HuaWeiPhone();}
}

优缺点

为了弥补简单工厂的缺点,普通工厂模式对工厂类也做了抽象
这样一个工厂只生产一个品牌手机,复合单一原则。
如果新增小米手机不用修改代码,直接扩展。
对于拓展同一等级的产品很友好,但在这种情况下只能生产这么一种产品,手机,不能生产多产品。

抽象工厂模式

要生产多个牌子的产品,且产品族产品数量有多个。
比如要生产苹果下面的手机和平板,华为下面的手机和平板

uml

在这里插入图片描述
相比较于普通工厂模式有两点不同
1:多了一个产品 平板
2:工厂类中多了一个生产平板的方法

代码

//1.创建一个产品接口(手机)
public interface Phone{void show();
}//对该接口实现(华为手机,苹果手机)
public class HuaWeiPhone implements Phone{@Overridepublic void show(){System.out.println("生产了一部华为手机");}
}public class PingGuoPhone implements Phone{@Overridepublic void show(){System.out.println("生产了一部苹果手机");}
}//2.创建一个产品接口(平板)
public interface Pad{void show();
}//对该接口实现(华为平板,苹果平板)
public class HuaWeiPad implements Pad{@Overridepublic void show(){System.out.println("生产了一部华为平板");}
}public class PingGuoPad implements Pad{@Overridepublic void show(){System.out.println("生产了一部苹果平板");}
}//创建平板工厂接口
public interface Factory{public Pad createPad();public Phone createPhone();
}
//对该接口实现(华为平板工厂,苹果平板工厂)
public class PingGuoFactory implements Factory{@Overridepublic Pad createPad(){return new PingGuoPad();}@Overridepublic Phone createPhone(){return new PingGuoPhone();}
}public class HuaWeiFactory implements Factory{@Overridepublic Pad createPad(){return new HuaWeiPad();}@Overridepublic Phone createPhone(){return new HuaWeiPhone();}
}

优缺点

可以新增一个产品族,比如加个小米系列
但不能增加产品等级,就不能加路由器产品。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...