简单工厂模式一般分为:普通简单工厂、多方法简单工厂、静态方法简单工厂
一、 普通简单工厂
-
例子:以工厂生产华为手机和苹果手机为例,类图如下:
-
类图主要角色
抽象产品(Abstract Product):为具体实现提供公共接口
具体产品(Concrete Product):实现抽象类的公共接口
工厂(Factory):提供创建实体对象的方法 -
代码实现如下
抽象产品
/**
* 手机
*/
public interface Phone {
// 打电话
void call();
}
具体产品
/**
* 华为手机
*/
public class HuaweiPhone implements Phone {
@Override
public void call() {
System.out.println("用华为手机打电话...");
}
}
/**
* 苹果手机
*/
public class ApplePhone implements Phone {
@Override
public void call() {
System.out.println("用苹果手机打电话...");
}
}
工厂
/**
* 工厂
*/
public class Factory {
public static String HUAWEI = "华为手机";
public static String APPLE = "苹果手机";
public Phone produce(String phoneType) {
if (HUAWEI.equals(phoneType)) {
System.out.println("新华为手机");
return new HuaweiPhone();
} else if (APPLE.equals(phoneType)) {
System.out.println("新苹果手机");
return new ApplePhone();
} else {
System.out.println("请输入正确的手机类型!");
return null;
}
}
}
测试
public class Test {
public static void main(String[] args) {
Factory factory = new Factory();
Phone huaweiPhone = factory.produce(Factory.HUAWEI);
huaweiPhone.call();
Phone applePhone = factory.produce(Factory.APPLE);
applePhone.call();
}
}
// 运行结果
新华为手机
用华为手机打电话...
新苹果手机
用苹果手机打电话...
二、多方法简单工厂
- 将上面的工厂(Factory)类修改
/**
* 工厂
*/
public class Factory {
public Phone produceHuaweiPhone() {
System.out.println("新华为手机");
return new HuaweiPhone();
}
public Phone produceApplePhone() {
System.out.println("新苹果手机");
return new ApplePhone();
}
}
测试
public class Test {
public static void main(String[] args) {
Factory factory = new Factory();
Phone huaweiPhone = factory.produceHuaweiPhone();
huaweiPhone.call();
Phone applePhone = factory.produceApplePhone();
applePhone.call();
}
}
// 运行结果
新华为手机
用华为手机打电话...
新苹果手机
用苹果手机打电话...
三、静态方法简单工厂
将上面的工厂(Factory )类修改下就行
/**
* 工厂
*/
public class Factory {
public static Phone produceHuaweiPhone() {
System.out.println("新华为手机");
return new HuaweiPhone();
}
public static Phone produceApplePhone() {
System.out.println("新苹果手机");
return new ApplePhone();
}
}
测试
public class Test {
public static void main(String[] args) {
Phone huaweiPhone= Factory.produceHuaweiPhone();
huaweiPhone.call();
Phone applePhone= Factory.produceApplePhone();
applePhone.call();
}
}
// 运行结果
新华为手机
用华为手机打电话...
新苹果手机
用苹果手机打电话...
总结:普通简单工厂如果传入的字符串有误,不能正确创建对象,静态工厂方法模式和多方法简单工厂相比不需要实例化工厂类。所以,大多数情况下,我们会选用静态工厂方法模式
- 简单工厂模式有一个问题就是,类的创建依赖工厂类,如果要拓展程序,必须对工厂类进行修改,这违背了开闭原则,所以工厂方法模式可以替换简单工厂模式