返回首页
一、概述
FactoryMethod属于创建型模式中的一种,定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。
二、适用性
1. 当一个类不知道它所必须创建的对象的类的时候。
2. 当一个类希望由它的子类来指定它所创建的对象的时候。
3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
三、参与者
1. Product:定义工厂方法所创建的对象的接口。
2. ConcreteProduct:实现Product接口。
3. Creator:声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。可以调用工厂方法以创建一个Product对象。
4. ConcreteCreator:重定义工厂方法以返回一个ConcreteProduct实例。
四、类图
五、代码实现
1.Product:定义工厂方法所创建的对象的接口。
Work.swift
//
// Work.swift
// 23设计模式
//
// Created by 阳君 on 14/11/27.
// Copyright (c) 2014年 六月. All rights reserved.
//
import Foundation
/// Work定义工厂方法所创建的对象的接口。
protocol Work {
func doWork()
}
2. ConcreteProduct:实现Product接口。
a) StudentWork.swift
//
// StudentWork.swift
// 23设计模式
//
// Created by 阳君 on 14/11/27.
// Copyright (c) 2014年 六月. All rights reserved.
//
import Foundation
/// StudentWork实现Work接口。
class StudentWork : Work {
func doWork() {
print("阳学生做作业!")
}
}
b) TeacherWork.swift
//
// TeacherWork.swift
// 23设计模式
//
// Created by 阳君 on 14/11/27.
// Copyright (c) 2014年 六月. All rights reserved.
//
import Foundation
/// TeacherWork实现Work接口。
class TeacherWork : Work {
func doWork() {
print("王老师审批作业!")
}
}
3. Creator:声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。可以调用工厂方法以创建一个Product对象。
IWorkFactory.swift
//
// IWorkFactory.swift
// 23设计模式
//
// Created by 阳君 on 14/11/27.
// Copyright (c) 2014年 六月. All rights reserved.
//
import Foundation
/// IWorkFactory 声明工厂方法,该方法返回一个Work类型的对象。IWorkFactory也可以定义一个工厂方法的缺省实现,它返回一个缺省的TeacherWork对象。可以调用工厂方法以创建一个Work对象。
protocol IWorkFactory {
func getWork() ->Work
}
4. ConcreteCreator:重定义工厂方法以返回一个ConcreteProduct实例。
a) StudentWorkFactory.swift
//
// StudentWorkFactory.swift
// 23设计模式
//
// Created by 阳君 on 14/11/27.
// Copyright (c) 2014年 六月. All rights reserved.
//
import Foundation
/// 重定义工厂方法以返回一个TeacherWork实例。
class StudentWorkFactory : IWorkFactory {
func getWork() ->Work {
return StudentWork()
}
}
b) TeacherWorkFactory.swift
//
// TeacherWorkFactory.swift
// 23设计模式
//
// Created by 阳君 on 14/11/27.
// Copyright (c) 2014年 六月. All rights reserved.
//
import Foundation
/// 重定义工厂方法以返回一个TeacherWork实例。
class TeacherWorkFactory : IWorkFactory {
func getWork() ->Work {
return TeacherWork()
}
}
六、测试
1. 代码
// 工厂方法
let studentWorkFactory:IWorkFactory = StudentWorkFactory()
studentWorkFactory.getWork().doWork()
let teacherWorkFactory:IWorkFactory = TeacherWorkFactory()
teacherWorkFactory.getWork().doWork()
2. 运行结果
阳学生做作业!
王老师审批作业!