工厂方法模式
我们来举个例子看一下,UML图如下所示:
Phone
是抽象的手机类,Mi
、Huawei
、Oppo
是具体的手机。
有一个生产手机的工厂接口PhoneFactory
,然后有三个实现了这个借口的具体工厂类:
MiPhoneFactory
HuaweiPhoneFactory
OppoPhoneFactory
下面看具体的代码:
抽象Phone
publicabstractclassPhone {
protectedStringname;
publicPhone(Stringname) {
this.name=name;
}
publicStringgetName() {
returnthis.name;
}
}
小米手机类:Mi
publicclassMiextendsPhone {publicMi(Stringname) {
super(name);
}
}
华为手机类:Huawei
publicclassHuaWeiextendsPhone {publicHuaWei(Stringname) {
super(name);
}
}
Oppo手机类:Oppo
publicclassOppoextendsPhone {publicOppo(Stringname) {
super(name);
}
}
然后是工厂,抽象工厂接口:
/*** 抽象的工厂接口
*/
publicinterfacePhoneFactory {
/**
* 创建手机的method
* @param name
* @return
*/
PhonecreatePhone(Stringname);
}
小米手机工厂
/*** 小米手机工厂
*/
publicclassMiPhoneFactoryimplementsPhoneFactory {
@Override
publicPhonecreatePhone(Stringname) {
returnnewMi(name);
}
}
华为手机工厂
/*** 华为手机工厂
*/
publicclassHuaWeiPhoneFactoryimplementsPhoneFactory {
@Override
publicPhonecreatePhone(Stringname) {
returnnewHuaWei(name);
}
}
Oppo手机工厂
/*** Oppo手机工厂
*/
publicclassOppoPhoneFactoryimplementsPhoneFactory {
@Override
publicPhonecreatePhone(Stringname) {
returnnewOppo(name);
}
}
Client端:
publicclassConsumerDemo {
publicstaticvoidmain(String[] args) throwsIOException {
// 生产华为手机
PhoneFactoryhuaWeiPhoneFactory=newHuaWeiPhoneFactory();
Phonephone=huaWeiPhoneFactory.createPhone("华为");
System.out.println(phone.getName());
// 生产Oppo手机
PhoneFactoryoppoPhoneFactory=newOppoPhoneFactory();
Phoneoppo=oppoPhoneFactory.createPhone("Oppo");
System.out.println(oppo.getName());
// 生产小米手机
PhoneFactorymiPhoneFactory=newMiPhoneFactory();
Phonemi=oppoPhoneFactory.createPhone("Mi");
System.out.println(mi.getName());
}
}
运行输出结果如下:
华为Oppo
Mi
最后我们可以根据以上代码思考一下工厂方法模式的优缺点。
优点:符合开闭原则,比简单工厂更容易扩展,新增一个产品的时候,只需要新增一个Factory接口的实现类即可,不用修改原有代码。
缺点:新增加产品的时候要创建一个新的具体产品生产类,这样随着产品的增加,会增加很多类。
以上是 工厂方法模式 的全部内容, 来源链接: utcz.com/z/514113.html