工厂模式的本质就是用工厂方法代替new操作创建一种实例化对象的方式,以提供一种方便地创建有同种类型接口的产品的复杂对象。
以创建手机为例,假设手机的品牌有华为和苹果两种类型,我们要实现的是根据不同的传入参数实例化不同的手机,则其具体的UML设计图如下。1、定义接口:
package cn.jaa.factory_pattern;
/**
* @Author: Jaa
* @Desc:定义一个接口,返回手机的品牌
* @Date: 2023/11/27 21:32
*/
public interface Phone {
String brand();
}
2、定义实现类:
package cn.jaa.factory_pattern;
/**
* @Author: Jaa
* @Date: 2023/11/27 21:33
*/
public class IPhone implements Phone {
@Override
public String brand() {
return "This is a Apple phone.";
}
}
package cn.jaa.factory_pattern;
/**
* @Author: Jaa
* @Date: 2023/11/27 21:34
*/
public class Huawei implements Phone{
@Override
public String brand() {
return "This is a Huawei phone.";
}
}
3、定义工厂类:
package cn.jaa.factory_pattern;
/**
* @Author: Jaa
* @Date: 2023/11/27 21:37
*/
public class Factory {
public Phone createPhone(String phoneName) {
if ("Apple".equals(phoneName)) {
return new IPhone();
} else if ("Huawei".equals(phoneName)) {
return new Huawei();
} else {
return null;
}
}
}
4、使用工厂模式测试:
package cn.jaa.factory_pattern;
import java.util.logging.Logger;
/**
* @Author: Jaa
* @Desc:工厂模式
*
* @Date: 2023/11/27 21:39
*/
public class FactoryDemo {
private static final Logger log = Logger.getLogger(String.valueOf(FactoryDemo.class));
public static void main(String[] args) {
Factory factory = new Factory();
Phone apple = factory.createPhone("Apple");
Phone huawei = factory.createPhone("Huawei");
log.info(apple.brand());
log.info(huawei.brand());
}
}
打印结果: