工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
工厂方法模式角色:
- 抽象工厂(Abstract Factory)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
- 具体工厂(Concrete Factory)角色 :这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建某一种产品对象。
- 抽象产品(AbstractProduct)角色 :工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
- 具体产品(Concrete Product)角色 :这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应
简单工厂例子中的奶茶接口以及相关奶茶实现类不变。我们只需要增加一个工厂接口以及实现这个接口的工厂类即可。
例子代码:
代码语言:javascript复制package com.example.factorypattern;
public interface MilkyTea {
/**
* 制造奶茶
*/
void makeMilkyTea();
}
代码语言:javascript复制package com.example.factorypattern;
public class BoBaMilkyTeam implements MilkyTea {
@Override
public void makeMilkyTea() {
System.out.println("制作波霸奶茶");
}
}
代码语言:javascript复制package com.example.factorypattern;
/**
* 红豆奶茶
*/
public class OrmosiaMilkyTea implements MilkyTea {
@Override
public void makeMilkyTea() {
System.out.println("制作红豆奶茶");
}
}
代码语言:javascript复制package com.example.factorypattern;
public class PearlMilkyTea implements MilkyTea {
@Override
public void makeMilkyTea() {
System.out.println("制作珍珠奶茶");
}
}
代码语言:javascript复制package com.example.factorypattern;
public interface Factory {
MilkyTea makeMilkyTea();
}
代码语言:javascript复制package com.example.factorypattern;
public class BoBaMilkyTeamFactory implements Factory{
@Override
public MilkyTea makeMilkyTea() {
return new BoBaMilkyTeam();
}
}
代码语言:javascript复制package com.example.factorypattern;
public class OrmosiaMilkyTeaFactory implements Factory {
@Override
public MilkyTea makeMilkyTea() {
return new OrmosiaMilkyTea();
}
}
代码语言:javascript复制package com.example.factorypattern;
public class PearlMilkyTeaFactory implements Factory {
@Override
public MilkyTea makeMilkyTea() {
return new PearlMilkyTea();
}
}
代码语言:javascript复制package com.example.factorypattern;
import com.example.simplefactory.SimpleFactory;
public class Test {
public static void main(String[] args) {
Factory boBaMilkyTeamFactory = new BoBaMilkyTeamFactory();
MilkyTea milkyTea = boBaMilkyTeamFactory.makeMilkyTea();
milkyTea.makeMilkyTea();
}
}