1、简单工厂模式
简单工厂模式:一个工厂、一种产品的不同型号。
比如:宝马车工厂,生产宝马车,可以生产宝马320、宝马330(不论真实是否有,只是学术举例)
工厂模式个人理解,好比有了销售部,假如之前需要,必须要到对应车间去,现在直接找销售说自己想要的型号就好了,宝马车会直接给到你。
1、产品类
public class BMW {
}
public class BMW320 extends BMW{
public BMW320() {
System.out.println("BMW320.BMW320");
}
}
public class BMW330 extends BMW{
public BMW330() {
System.out.println("BMW330.BMW330");
}
}
2、工厂类
public class BMWFactory {
public BMW createBMW(int type) {
switch (type) {
case 330:
return new BMW330();
case 320:
return new BMW320();
default:
return null;
}
}
}
3、使用类
public class TestFactory {
public static void main(String[] args) {
BMWFactory bmwFactory = new BMWFactory();
bmwFactory.createBMW(320);
bmwFactory.createBMW(330);
}
}
4、输出
BMW320.BMW320
BMW330.BMW330
2、工厂模式
工厂模式:一个抽象工厂,多个具体工厂,一种产品的抽象类及产品的多个类型实现,一个工厂实现只能生产一类产品。
比如:
一个抽象工厂:抽象宝马车工厂,
多个具体工厂:宝马320工厂、宝马330工厂,
一种产品的抽象类及产品实现:宝马车抽象类、宝马320实现类、宝马330实现类
缺点:产品新增一个类型,需要增加一个产品实现类和一个新类型的工厂
0、类图
1、产品类
public class BMW {
}
public class BMW320 extends BMW{
public BMW320() {
System.out.println("BMW320.BMW320");
}
}
public class BMW330 extends BMW{
public BMW330() {
System.out.println("BMW330.BMW330");
}
}
2、工厂类
public interface BMWFactory {
BMW createBMW();
}
public class BMW320Factory implements BMWFactory{
@Override
public BMW createBMW() {
return new BMW320();
}
}
public class BMW330Factory implements BMWFactory{
@Override
public BMW createBMW() {
return new BMW330();
}
}
3、使用类
public class TestFactory {
public static void main(String[] args) {
BMW320Factory bmw320Factory = new BMW320Factory();
bmw320Factory.createBMW();
BMW330Factory bmw330Factory = new BMW330Factory();
bmw330Factory.createBMW();
}
}
4、输出
BMW320.BMW320
BMW330.BMW330
5、增加要求:生产宝马340
新增一个产品实现类、一个工厂类,不需要修改原来的设计逻辑,符合开闭原则
产品实现类
public class BMW340 extends BMW {
public BMW340() {
System.out.println("BMW340.BMW340");
}
}
工厂类
public class BMW340Factory implements BMWFactory{
@Override
public BMW createBMW() {
return new BMW340();
}
}
使用类
public class TestFactory {
public static void main(String[] args) {
BMW320Factory bmw320Factory = new BMW320Factory();
bmw320Factory.createBMW();
BMW330Factory bmw330Factory = new BMW330Factory();
bmw330Factory.createBMW();
BMW340Factory bmw340Factory = new BMW340Factory();
bmw340Factory.createBMW();
}
}
输出结果
BMW320.BMW320
BMW330.BMW330
BMW340.BMW340
3、抽象工厂模式
产品等级结构和产品族结构示意图:
产品等级结构:产品等级结构即产品的继承结构。
如一个抽象类是冰箱,其子类有海尔冰箱、美的冰箱、小米冰箱、苏泊尔冰箱,则抽象冰箱与具体品牌的冰箱之间构成了一个产品等级结构,抽象冰箱是父类,而具体品牌的冰箱是其子类。
产品族:产品族是指由同一个工厂生产的(此处的工厂指的是工厂的实现类),位于不同产品等级结构中的一组产品。
如海尔电器工厂生产的海尔冰箱、海尔电饭锅、海尔扫地机器人,
海尔冰箱位于冰箱产品等级结构中,
海尔电饭锅位于电饭锅产品等级结构中,
海尔扫地机器人位于扫地机器人产品等级结构中,
海尔冰箱、海尔电饭锅、海尔扫地机器人构成了一个产品族,海尔产品族。
下面类图和代码实现,
产品族有2022、2023,最后扩展了2024,对应现实生活中的产品迭代,2022款、2023款,也可以类比,比如长安汽车的55plus、65plus、75plus。
产品等级结构有2种,冰箱和扫地机器人
后续有时间会画一个代码实现的产品族和产品等级结构图,或者实现上述图。
0、类图如下
1、产品类
/**
* 小米冰箱
*/
public class Refrigerator {
}
/**
* 小米冰箱2022
*/
public class Refrigerator2022 extends Refrigerator {
public Refrigerator2022() {
System.out.println("Refrigerator2022.Refrigerator2022");
}
}
/**
* 小米冰箱2023
*/
public class Refrigerator2023 extends Refrigerator {
public Refrigerator2023() {
System.out.println("Refrigerator2023.Refrigerator2023");
}
}
/**
* 小米扫地机器人
*/
public class SweepingRobot {
}
/**
* 小米扫地机器人2022
*/
public class SweepingRobot2022 extends SweepingRobot {
public SweepingRobot2022() {
System.out.println("SweepingRobot2022.SweepingRobot2022");
}
}
/**
* 小米扫地机器人2023
*/
public class SweepingRobot2023 extends SweepingRobot {
public SweepingRobot2023() {
System.out.println("SweepingRobot2023.SweepingRobot2023");
}
}
2、工厂类
/**
* 小米抽象工厂类
*
* 实战应用中应该是抽象类,抽象类比接口灵活很多
*/
public interface XMFactory {
/**
* 生产小米冰箱
*/
Refrigerator createRefrigerator();
/**
* 生产小米
* @return
*/
SweepingRobot createSweepingRobot();
}
/**
* 小米抽象工厂类2022
*/
public class XMFactory2022 implements XMFactory{
@Override
public Refrigerator createRefrigerator(){
return new Refrigerator2022();
}
@Override
public SweepingRobot createSweepingRobot(){
return new SweepingRobot2022();
}
}
/**
* 小米抽象工厂类2023
*/
public class XMFactory2023 implements XMFactory {
@Override
public Refrigerator createRefrigerator() {
return new Refrigerator2023();
}
@Override
public SweepingRobot createSweepingRobot() {
return new SweepingRobot2023();
}
}
3、使用类
public class Client {
public static void main(String[] args) {
System.out.println("生产2022版小米产品开始...............");
XMFactory2022 xmFactory2022 = new XMFactory2022();
xmFactory2022.createSweepingRobot();
xmFactory2022.createRefrigerator();
System.out.println("生产2022版小米产品结束...............\n");
System.out.println("生产2023版小米产品开始...............");
XMFactory2023 xmFactory2023 = new XMFactory2023();
xmFactory2023.createRefrigerator();
xmFactory2023.createSweepingRobot();
System.out.println("生产2023版小米产品结束...............");
}
}
4、输出
生产2022版小米产品开始...............
SweepingRobot2022.SweepingRobot2022
Refrigerator2022.Refrigerator2022
生产2022版小米产品结束...............
生产2023版小米产品开始...............
Refrigerator2023.Refrigerator2023
SweepingRobot2023.SweepingRobot2023
生产2023版小米产品结束...............
5、增加要求:生产2024款产品
/**
* 小米冰箱2024
*/
public class Refrigerator2024 extends Refrigerator {
public Refrigerator2024() {
System.out.println("Refrigerator2024.Refrigerator2024");
}
}
/**
* 小米扫地机器人2024
*/
public class SweepingRobot2024 extends SweepingRobot {
public SweepingRobot2024() {
System.out.println("SweepingRobot2024.SweepingRobot2024");
}
}
/**
* 小米抽象工厂类2024
*/
public class XMFactory2024 implements XMFactory {
@Override
public Refrigerator createRefrigerator() {
return new Refrigerator2024();
}
@Override
public SweepingRobot createSweepingRobot() {
return new SweepingRobot2024();
}
}
public class Client {
public static void main(String[] args) {
System.out.println("生产2022版小米产品开始...............");
XMFactory2022 xmFactory2022 = new XMFactory2022();
xmFactory2022.createSweepingRobot();
xmFactory2022.createRefrigerator();
System.out.println("生产2022版小米产品结束...............\n");
System.out.println("生产2023版小米产品开始...............");
XMFactory2023 xmFactory2023 = new XMFactory2023();
xmFactory2023.createRefrigerator();
xmFactory2023.createSweepingRobot();
System.out.println("生产2023版小米产品结束...............\n");
System.out.println("生产2024版小米产品开始...............");
XMFactory2024 xmFactory2024 = new XMFactory2024();
xmFactory2024.createRefrigerator();
xmFactory2024.createSweepingRobot();
System.out.println("生产2024版小米产品结束...............\n");
}
}
生产2022版小米产品开始...............
SweepingRobot2022.SweepingRobot2022
Refrigerator2022.Refrigerator2022
生产2022版小米产品结束...............
生产2023版小米产品开始...............
Refrigerator2023.Refrigerator2023
SweepingRobot2023.SweepingRobot2023
生产2023版小米产品结束...............
生产2024版小米产品开始...............
Refrigerator2024.Refrigerator2024
SweepingRobot2024.SweepingRobot2024
生产2024版小米产品结束...............
总结
工厂模式可以生产一种产品的多类型实体,即一个产品等级结构,即一个抽象产品类,多个实现产品子类
抽象工厂模式可以生产多种产品的多类型实体,即多个产品等级结构,即多个抽象产品类,多个实现产品子类。
抽象工厂模式的优点:
比如要实现生产3个产品等级结构,每种产品结构有3种产品族
用工厂模式实现,需要9个工厂实现类,用抽象工厂模式只需要3个,数字越大,比例优势越明显
抽象工厂模式的缺点:
抽象工厂模式需要新增一种产品族的时候,是比较方便的,是符合开闭原则的,
但是新增一种产品等级结构时,是比较麻烦的,需要修改之前所有的实现类,违背开闭原则的