java设计模式之工厂方法模式
Posted J_Newbie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java设计模式之工厂方法模式相关的知识,希望对你有一定的参考价值。
定义:
工厂方法模式又叫做多态性工厂模式,指定义一个创建对象的接口,但又实现这个接口的类来决定实例化那个类,工厂化方法把类的实例化推迟到子类中进行。
在工厂化方法模式中,不再由单一的工厂类生产产品,而是由工厂类的子类实现具体产品的创建,因此,当增加一个产品时,只需要增加一个相应的工厂类的子类,实现生产这种产品,便可以解决简单工厂生产太多产品导致其内部代码臃肿的问题,也符合开闭原则。
应用场景:
-
创建对象需要大量的重复代码
-
客户端(应用层)不依赖产品类实例如何被创建,实现等细节
-
一个类通过其子类来指定创建哪个对象
UML类图:
由上图可以看见,抽象工厂模式主要包含4个角色:
-
抽象工厂:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口
-
具体工厂:是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且被应用程序调用以创建产品对象
-
抽象产品:是工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口
-
具体产品:这个角色实现了抽象产品角色所定义的接口,某具体产品由专门的具体工厂创建,它们之间往往一一对应
通用写法:
public class Client
public static void main(String[] args)
IFactory factory = new FactoryA();
factory.makeProduct().doSomething();
factory = new FactoryB();
factory.makeProduct().doSomething();
factory = new FactoryC();
factory.makeProduct().doSomething();
//抽象工厂
public interface IFactory
IProduct makeProduct();
//生产ProductA的具体工厂类
public class FactoryA implements IFactory
public IProduct makeProduct()
return new ProductA();
//生产ProductB的具体工厂类
public class FactoryB implements IFactory
public IProduct makeProduct()
return new ProductB();
//生产ProductC的具体工厂类
public class FactoryC implements IFactory
public IProduct makeProduct()
return new ProductC();
//抽象产品
public interface IProduct
void doSomething();
//具体产品:ProductA
public static ProductA implements IProduct
public void doSomething()
System.out.println("I am Product A");
//具体产品:ProductB
public static ProductB extends FactoryB implements IProduct
public void doSomething()
System.out.println("I am Product B");
//具体产品:ProductC
public static ProductC implements IProduct
public void doSomething()
System.out.println("I am Product C");
案例:
工厂方法模式主要解决产品扩展问题,再简单工厂中,随着产品链的丰富,如果每个课程的创建逻辑都有区别,则工厂的职责会变的越来越多,有点像万能工厂,不利于维护,根据单一职能原则,我们将继续拆分,专人干专事。拿课程为例:
public interface ICourseFactory
ICourse create();
然后创建子工厂:
public class JavaCourseFactory implements ICourseFactory
public ICourse create()
return new JavaCourse();
PythonCourseFactory类的代码如下:
public class PythonCourseFactory implements ICourseFactory
public ICourse create()
return new PythonCourse();
客户端测试代码如下:
public static void main(String[] args)
ICourseFactory factory = new PythonCourseFactory();
factory.create().doSomething();
工厂方法模式的优点:
-
灵活性增强,对于新产品的创建,只需多写一个相应的工厂类
-
典型的解耦框架。高层模块只需要知道产品的抽象类,无需关心其他的实现类,满足迪米特法则,依赖倒置原则和里氏替换原则
工厂方法的缺点:
-
类的个数容易过多,增加复杂度
-
增加了系统的抽象性和理解的难度
-
抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决
以上是关于java设计模式之工厂方法模式的主要内容,如果未能解决你的问题,请参考以下文章