一、模式动机
考虑一个简单场景,一个软件系统可以提供多个外观不同的按钮,这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望不需要知道这些具体按钮类的名字,只需要知道按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象。
二、模式定义
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通过它根据自变量的不同返回不同的类的实例。简单工厂模式专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。
三、模式结构
四、参与者
Factory:工厂角色
工厂类在客户端的直接控制下(Create方法)创建产品对象。Product:抽象产品角色
定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。ConcreteProduct:具体产品角色
定义工厂具体加工出的对象。
五、示例代码
package design.pattern;
abstract class MobilePhone {
public abstract void call();
public abstract void sendMsg();
}
class Iphone4S extends MobilePhone {
public void call() {
System.out.println("Iphone4S call");
}
public void sendMsg() {
System.out.println("Iphone4S send message");
}
}
class GalaxyNote2 extends MobilePhone {
public void call() {
System.out.println("GalaxyNote2 call");
}
public void sendMsg() {
System.out.println("GalaxyNote2 send message");
}
}
class HTCOneM7 extends MobilePhone {
public void call() {
System.out.println("HTCOneM7 call");
}
public void sendMsg() {
System.out.println("HTCOneM7 send message");
}
}
public class SimpleFactory {
static MobilePhone phone;
public static MobilePhone createPhone(String name) {
switch (name) {
case "Iphone4S":
phone = new Iphone4S();
break;
case "GalaxyNote2":
phone = new GalaxyNote2();
break;
case "HTCOneM7":
phone = new HTCOneM7();
break;
default:
break;
}
return phone;
}
public static void main(String[] args) {
MobilePhone phone = SimpleFactory.createPhone("GalaxyNote2");
phone.call();
phone.sendMsg();
}
}
模式结构
简单工厂优点
- 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任。简单工厂模式通过这种做法实现了对象创建和使用的分离。
- 客户端代码简洁,无需知道所创建具体产品的类名,只需知道对应的参数,可以减少使用者的记忆量。
简单工厂缺点
- 工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
- 增加了系统中类的数量,增加了系统的复杂度和理解难度。
- 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂,不利于扩展。
- 简单工厂模式通常使用静态工厂方法,造成工厂角色无法形成基于继承的等级结构。