简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
将“类实例化的操作”与“使用对象的操作”分开,让使用者不用知道具体参数就可以实例化出所需要的“产品”类,从而避免了在客户端代码中显式指定,实现了解耦。
二.应用我们通过手机的生产过程来演示简单工厂模式。
新建手机产品的接口及其实现类/**
* 手机接口
*/
public interface Phone {
//拨打电话
void call();
}
/**
* 华为手机
*/
public class Huawei implements Phone{
@Override
public void call() {
System.out.println("华为拨打电话");
}
}
/**
* 苹果手机
*/
public class Iphone implements Phone {
@Override
public void call() {
System.out.println("iphone拨打电话");
}
}
/**
* 小米手机
*/
public class Xiaomi implements Phone{
@Override
public void call() {
System.out.println("小米拨打电话");
}
}
新建用来表示手机名称的枚举类
/**
* 用来表示手机名称的枚举类
*/
public enum PhoneNameEnum {
//iphone
IPHONE("iphone"),
//小米
XIAOMI("xiaomi"),
//小米
HUAWEI("huawei");
String name;
PhoneNameEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
新建生产手机产品的工厂类
/**
* phone 的抽象工厂类
* 提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 producePhone() 来创建手机产品。
*/
public abstract class AbstractPhoneFactory {
//生产 phone
public abstract Phone producePhone();
}
测试
public class Test {
//简单工厂模式
public static void main(String[] args) {
PhoneFactory phoneFactory = new PhoneFactory();
String huawei = "huawei";
String xiaomi = "xiaomi";
String iphone = "iphone";
//这里提交了Java 一个很重要的特性---多态
Phone huaweiPhone = phoneFactory.producePhone(huawei);
huaweiPhone.call();
Phone xiaomiPhone = phoneFactory.producePhone(xiaomi);
xiaomiPhone.call();
Phone iphonePhone = phoneFactory.producePhone(iphone);
iphonePhone.call();
}
}
华为拨打电话
iphone拨打电话
小米拨打电话
可以看到工厂类根据参数类型返回相应的手机类,但是如果以后我们要新增新的轿手机,比如三星,那么我们就得修改工厂类,加上对应的else if分支,这违反了开闭原则。
怎么优化呢? 可以用工厂模式,下节学习