简单工厂模式:定义一个工厂类,在该类的统一静态方法中根据不同的参数实例化不同的对象。
UML图:
手机抽象类,抽象不同的产品
public interface AbstractPhone {
void make();
}
手机实现类
public class HuaweiPhone implements AbstractPhone {
public HuaweiPhone() {
this.make();
}
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("制造华为手机");
}
}
public class MiPhone implements AbstractPhone {
public MiPhone() {
this.make();
}
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("生产小米手机");
}
}
简单工厂类
public class PhoneFactory {
public static AbstractPhone getPhone(String phoneType) {
if ("MiPhone".equals(phoneType)) {
return new MiPhone();
} else if ("HuaweiPhone".equals(phoneType)) {
return new HuaweiPhone();
}
return null;
}
}
测试类
public class FactoryPattern {
public static void main(String[] args) {
AbstractPhone miPhone = PhoneFactory.getPhone("MiPhone");
AbstractPhone huaweiPhone = PhoneFactory.getPhone("HuaweiPhone");
}
}
/**
生产小米手机
制造华为手机
*/
使用静态方法将实例的创建和使用分离开。只需要调用静态方法就能获得需要的对象。
这种设计模式的问题在于,每添加一个新的产品就需要修改静态方法,不利于软件的维护。同时把所有的产品都放在一个当中将会导致该类十分臃肿。
工厂方法模式是对简单工厂模式的进一步解耦,因为在工厂模式中一个工厂子类对应一个产品子类。
工厂接口和产品接口
package javatest.pattern.factorymethod;
public interface AbstractFactory {
public AbstractPhone createPhone();
}
package javatest.pattern.factorymethod;
public interface AbstractPhone {
public void make();
}
具体工厂类
public class HuaweiFactory implements AbstractFactory{
@Override
public AbstractPhone createPhone() {
// TODO Auto-generated method stub
return new HuaweiPhone();
}
}
public class MiFactory implements AbstractFactory {
@Override
public AbstractPhone createPhone() {
// TODO Auto-generated method stub
return new MiPhone();
}
}
具体产品类
public class HuaweiPhone implements AbstractPhone {
public HuaweiPhone() {
this.make();
}
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("制造华为手机");
}
}
public class MiPhone implements AbstractPhone {
public MiPhone() {
this.make();
}
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("生产小米手机");
}
}
1- 工厂方法模式,在简单工厂模式的基础上进一步解耦,将各个产品的工厂单独继承一个抽象工厂类,把统一的工厂方法分解到了各个对应产品的工厂中。如此一来,如果需要添加一个产品只需要新继承一个类,用它类进行创建对象就可以。不需要修改其他代码。
2- 工厂方法模式,它克服了简单工厂模式违背开-闭原则,有保持了面向对象的封装性。
工厂方法模式的缺点是每增加一个产品类,就需要增加一个对应的工厂类,增加了额外的开发量。