【设计模式】工厂方法模式
·
前言
Github:https://github.com/yihonglei/java-design-patterns
一 工厂模式作用
工厂模式(factory pattern)是一种常用的对象创建型设计模式,是用工厂方法代替new操作的一种模式。
定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使得一个类的实例延迟到其子类。
我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,
所以以后new时就要多个心眼,但是可以考虑使用工厂模式,虽然这样做,可能多做一些工作,
但会给你系统带来更大的可扩展性和尽量少的修改量。
二 应用场景
(1)当一个类希望由它的子类来指定它所创建的对象的时候。
(2)当一个类不知道自己必须创建哪些对象的时候。
三 UML类图
工厂方法模式的静态类图:

四 参与对象
1)抽象工厂(Creator)角色
是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
2)具体工厂(Concrete Creator)角色
这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
3)抽象产品(Product)角色
工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
4)具体产品(Concrete Product)角色
这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
工厂模式分为工厂方法(Factory Method),抽象工厂(Abstract Factory)。这里主要说工厂方法模式。
五 工厂方法模式实战
实战类图:
product
package com.jpeony.design.patterns.factory;
/**
* 抽象产品(Product)角色:
* 工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
*
* @author yihonglei
*/
public interface Work {
void doWork();
}
Concrete Product
package com.jpeony.design.patterns.factory;
/**
* 具体产品(Concrete Product)角色:实现接口对象为具体对象
*
* @author yihonglei
*/
public class StudentWork implements Work {
@Override
public void doWork() {
System.out.println("学生做作业");
}
}
package com.jpeony.design.patterns.factory;
/**
* 具体产品(Concrete Product)角色:实现接口对象为具体对象
*
* @author yihonglei
*/
public class TeacherWork implements Work {
@Override
public void doWork() {
System.out.println("老师批改作业");
}
}
Creator
package com.jpeony.design.patterns.factory;
/**
* 抽象工厂(Creator)角色:
* 是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
*
* @author yihonglei
*/
public interface IWorkFactory {
Work getWork();
}
Concrete Creator
package com.jpeony.design.patterns.factory;
/**
* 具体工厂(Concrete Creator)角色:
* 这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
*
* @author yihonglei
*/
public class StudentWorkFactory implements IWorkFactory {
@Override
public Work getWork() {
return new StudentWork();
}
}
package com.jpeony.design.patterns.factory;
/**
* 具体工厂(Concrete Creator)角色:
* 这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
*
* @author yihonglei
*/
public class TeacherWorkFactory implements IWorkFactory {
@Override
public Work getWork() {
return new TeacherWork();
}
}
Test
package com.jpeony.design.patterns.factory;
/**
* 工厂方法模式应用程序测试,通过工厂创建具体产品对象。
*
* @author yihonglei
*/
public class FactoryMethodTest {
public static void main(String[] args) {
StudentWorkFactory studentWorkFactory = new StudentWorkFactory();
studentWorkFactory.getWork().doWork();
TeacherWorkFactory teacherWorkFactory = new TeacherWorkFactory();
teacherWorkFactory.getWork().doWork();
}
}
运行结果
更多推荐
所有评论(0)