设计模式之工厂模式!

简单工厂模式

定义一个工厂类,使用static方法创建对象,根据不同参数返回不同实例,每增加一个对象需要修改工厂类,违背了开闭原则

  • 不推荐使用

只适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象不需要关心。

一旦有了新的实现类,就需要修改工厂实现,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

UML类图:

img

使用手机生产来讲解该模式:

1
2
3
public interface Phone {
void make();
}

制造小米手机(Product1):

1
2
3
4
5
6
public class MiPhone implements Phone {
@Override
public void make() {
System.out.println("make xiaomi phone!");
}
}

手机代工厂(Factory):

1
2
3
4
5
6
7
8
public class PhoneFactory {
public Phone makePhone(String phoneType) {
if(phoneType.equalsIgnoreCase("MiPhone")){
return new MiPhone();
}
return null;
}
}

工厂方法模式

定义一个用于创建对象的接口,让子类决定将哪一个类实例化,此模式使一个类的实例化延迟到其子类

  • 但是工厂方法会导致类的个数过多,增加复杂度,增加系统的抽象性和理解难度。

它可以创建一个工厂接口和多个工厂实现类,这样如果增加新的功能,只需要添加新的工厂类就可以,不需要修改之前的代码。

另外,工厂方法模式还可以和模板方法模式结合一起,将他们共同的基础逻辑抽取到父类中,其它的交给子类去实现。

UML类图:

img

代码体现

某平台先拥有Java和Python学习视频,将来需要拓展业务开放FE(前端)视频学习。

image-20231007150732447

1
2
3
public abstract class Video {
public abstract void produce();
}
1
2
3
4
5
6
public class JavaVideo extends Video {
@Override
public void produce() {
System.out.println("录制Java课程视频");
}
}
1
2
3
4
5
6
public class PythonVideo extends Video {
@Override
public void produce() {
System.out.println("录制Python课程视频");
}
}
1
2
3
public abstract class VideoFactory {
public abstract Video getVideo();
}
1
2
3
4
5
public class JavaVideoFactory extends VideoFactory {
public Video getVideo() {
return new JavaVideo();
}
}
1
2
3
4
5
public class PythonVideoFactory extends VideoFactory {
public Video getVideo() {
return new PythonVideo();
}
}
1
2
3
4
5
6
7
8
public class Test {
public static void main(String[] args) {
VideoFactory videoFactory = new JavaVideoFactory();
Video video = videoFactory.getVideo();
video.produce();
System.out.println(video);
}
}

当拓展业务时,可以仿照JavaPython,可以直接添加FEVideoFEVideoFactory,可以体现出开放封闭原则。

抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,用于创建一个产品族的产品。

工厂方法模式和抽象工厂模式,它们之间最大的区别在于:

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

UML类图:

img

定义PC产品的接口(AbstractPC):

1
2
3
public interface PC {
void make();
}

定义小米电脑产品(MIPC):

1
2
3
4
5
6
public class MiPC implements PC {
@Override
public void make() {
System.out.println("make xiaomi PC!");
}
}

定义苹果电脑产品(MAC):

1
2
3
4
5
6
public class MAC implements PC {
@Override
public void make() {
System.out.println("make MAC!");
}
}

增加PC产品制造接口:

1
2
3
4
public interface AbstractFactory {
Phone makePhone();
PC makePC();
}

增加小米PC的制造(ConcreteFactory1):

1
2
3
4
5
6
7
8
9
10
public class XiaoMiFactory implements AbstractFactory{
@Override
public Phone makePhone() {
return new MiPhone();
}
@Override
public PC makePC() {
return new MiPC();
}
}