工厂方法模式简介
工厂方法模式 : Factory Method Pattern : 是一种
创建型模式
。
核心 :定义一个创建对象的接口,具体的创建对象的动作由子类实现
。
效果 : 工厂方法的模式,使得目标类的实例化过程延迟到了 工厂子类中
。
核心角色介绍
产品类 :要创建的
目标类
,也可以是接口类型
; 比如 : 手机。
具体产品类 : 要创建的目标类的具体的类型
; 比如 : 小米手机。
工厂类 :声明工厂方法,该方法返回的是产品类型的对象。可以包含其他业务逻辑,但并不负责创建具体的产品实例
;比如 : 手机工厂。
具体工厂类 : 包含对具体产品的引用,并实现工厂类中的方法,以及返回产品对象;比如 : 小米手机工厂。
使用场景案例
场景介绍
1、有一个 手机类型;
2、有 小米手机 和 华为手机 两个具体的手机类型;
3、有一个 手机工厂的 接口;
4、有小米手机工厂 和 华为手机工厂 两个具体的生产手机的工厂类,分别生产不同的具体类型的手机。
UML类图
具体代码实现
手机抽象类
java
public abstract class Phone {
/**
* 手机品牌名称
*/
protected String brandName;
/**
* 抽象方法 : 拨打电话
*/
protected abstract void call();
public Phone(String brandName) {
this.brandName = brandName;
}
public String getBrandName() {
return brandName;
}
public void setBrandName(String brandName) {
this.brandName = brandName;
}
}
小米手机类
java
public class XiaomiPhone extends Phone{
public XiaomiPhone(String brandName) {
super(brandName);
}
@Override
protected void call() {
System.out.println(brandName + " 正在拨打电话。。。");
}
}
华为手机类
java
public class HuaweiPhone extends Phone{
public HuaweiPhone(String brandName) {
super(brandName);
}
@Override
protected void call() {
System.out.println(brandName + " is calling ......");
}
}
工厂接口
java
public interface PhoneFactory {
/**
* 创建手机对象的方法
*/
Phone createPhone();
}
小米手机工厂
java
public class XiaomiPhoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {
return new XiaomiPhone("小米14");
}
}
华为手机工厂
java
public class HuaweiPhoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {
return new HuaweiPhone("华为mate50");
}
}
测试使用
java
public class FactoryMethodPatternTest {
public static void main(String[] args) {
// 要创建的对象
Phone phone = null;
// 创建对象的工厂类
PhoneFactory phoneFactory = null;
String brandName = "xiaomi";
// 根据条件,使用不同的具体的工厂类,进行对象的创建
if (brandName.equals("huawei")){
// 使用具体的工厂类进行对象的创建
phoneFactory = new HuaweiPhoneFactory();
phone = phoneFactory.createPhone();
}else if (brandName.equals("xiaomi")){
// 使用具体的工厂类进行对象的创建
phoneFactory = new XiaomiPhoneFactory();
phone = phoneFactory.createPhone();
}
// 调用 对象进行打电话
phone.call();
}
}
运行结果 : 根据条件使用不同的工厂创建具体的手机对象:
小米14 正在拨打电话。。。