意图:定义一个创建对象的接口,让其子类自己决定实例化那个类,工厂模式使其创建过程延迟到子类进行。
主要解决: 接口选择问题。
何时使用: 明确知道和条件下创建不同实例时。
如何解决: 让其子类实现工厂接口,返回的也是一个抽象对象。
关键代码: 创建过程在其子类执行。
优点: 良好的封装性,代码结构清晰;扩展性高;屏蔽对象的具体实现,只关心对象的接口;解耦框架。
缺点: 每次增加一个不同的框架时,都需要增加一个具体类和对象实现工厂,类的个数成倍增加,增加了系统的复杂度,同时也增加了系统具体类的依赖。
应用实例: 我们去茶馆喝茶,我们只需要说出茶的名称,并不需要知道服务员在上茶之前做的所有过程。
1. 创建一个接口TeaInterface
public interface TeaInterface {
//茶的颜色
void getColor();
}
2. 创建实现接口的实体类Longjing
、Tieguanyin
、Keemum black tea
public class Longjing implements TeaInterface{
@Override
public void getColor() {
System.out.println("龙井茶绿色");
}
}
public class Tieguanyin implements TeaInterface{
@Override
public void getColor() {
System.out.println("铁观音青色");
}
}
public class KeemumBlackTea implements TeaInterface{
@Override
public void getColor() {
System.out.println("祁门红茶红色");
}
}
3. 创建一个工厂,生成基于给定信息的实体类对象。
public class MakeTeaFactory {
//使用getTeaColor方法获取茶颜色的对象
public TeaInterface getTeaColor(String teaName) {
if(teaName == null) {
return null;
}
switch (teaName) {
case "Longjing":
return new Longjing();
case "Tieguanyin":
return new Tieguanyin();
case "KeemumBlackTea":
return new KeemumBlackTea();
}
return null;
}
}
4.使用该工厂,通过传递茶名来获取实体类的对象
public class DrinkTea {
public static void main(String[] args) {
MakeTeaFactory mtf = new MakeTeaFactory();
//获取绿茶
TeaInterface ljt = mtf.getTeaColor("Longjing");
ljt.getColor();
//获取红茶
TeaInterface kbt = mtf.getTeaColor("KeemumBlackTea");
kbt.getColor();
//获取青茶
TeaInterface tgyt = mtf.getTeaColor("Tieguanyin");
tgyt.getColor();
}
}
5. 运行程序,查看结果
龙井茶绿色
祁门红茶红色
铁观音青色
网友评论