设计模式之工厂模式!
设计模式之工厂模式!
月伴飞鱼简单工厂模式
定义一个工厂类,使用
static
方法创建对象,根据不同参数返回不同实例,每增加一个对象需要修改工厂类,违背了开闭原则。
- 不推荐使用
只适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象不需要关心。
一旦有了新的实现类,就需要修改工厂实现,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
UML类图:
使用手机生产来讲解该模式:
1 | public interface Phone { |
制造小米手机(Product1
):
1 | public class MiPhone implements Phone { |
手机代工厂(Factory
):
1 | public class PhoneFactory { |
工厂方法模式
定义一个用于创建对象的接口,让子类决定将哪一个类实例化,此模式使一个类的实例化延迟到其子类。
- 但是工厂方法会导致类的个数过多,增加复杂度,增加系统的抽象性和理解难度。
它可以创建一个工厂接口和多个工厂实现类,这样如果增加新的功能,只需要添加新的工厂类就可以,不需要修改之前的代码。
另外,工厂方法模式还可以和模板方法模式结合一起,将他们共同的基础逻辑抽取到父类中,其它的交给子类去实现。
UML类图:
代码体现
某平台先拥有Java和Python学习视频,将来需要拓展业务开放FE(前端)视频学习。
1 | public abstract class Video { |
1 | public class JavaVideo extends Video { |
1 | public class PythonVideo extends Video { |
1 | public abstract class VideoFactory { |
1 | public class JavaVideoFactory extends VideoFactory { |
1 | public class PythonVideoFactory extends VideoFactory { |
1 | public class Test { |
当拓展业务时,可以仿照
Java
与Python
,可以直接添加FEVideo
与FEVideoFactory
,可以体现出开放封闭原则。
抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,用于创建一个产品族的产品。
工厂方法模式和抽象工厂模式,它们之间最大的区别在于:
- 工厂方法模式只有一个抽象产品类,具体工厂类只能创建一个具体产品类的实例。
- 抽象工厂模式有多个抽象产品类,具体工厂类可以创建多个具体产品类的实例。
UML类图:
定义PC产品的接口(AbstractPC
):
1 | public interface PC { |
定义小米电脑产品(MIPC):
1 | public class MiPC implements PC { |
定义苹果电脑产品(MAC):
1 | public class MAC implements PC { |
增加PC产品制造接口:
1 | public interface AbstractFactory { |
增加小米PC的制造(ConcreteFactory1
):
1 | public class XiaoMiFactory implements AbstractFactory{ |