1.简单工厂不算是一种设计模式,比较像是一种编程习惯;2.优点
a.封装变化
b.避免客户直接创建的产品
c.针对接口编程
d.易扩展,新加产品类只需修改工厂类
3.缺点
a.工厂封转了产品创建的逻辑,违反了高内聚责任分配原则
4.使用场景
a.简单的,工厂创建对象比较少
b.客户需要知道创建参数,不必关系创建实现
5.所属基本模式类别
创建型模式
6.简单例子UML图
![](https://img-my.csdn.net/uploads/201303/13/1363169835_4300.png)
7.代码
//
// main.m
// SimpleFactory
//
// Created by Robin on 3/12/13.
// Copyright (c) 2013 Robin. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "DuckStore.h"
#import "SimpleDuckFactory.h"
int main(int argc, const char * argv[])
{
SimpleDuckFactory *factory = [[[SimpleDuckFactory alloc]init]autorelease];
DuckStore *store = [[[DuckStore alloc]initWithFactory:factory]autorelease];
[store orderDuck:1];
[store orderDuck:2];
return 0;
}
//
// DuckStore.h
// SimpleFactory
//
// Created by Robin on 3/12/13.
// Copyright (c) 2013 Robin. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Duck.h"
#import "SimpleDuckFactory.h"
@interface DuckStore : NSObject
{
SimpleDuckFactory *_factory;
}
@property (nonatomic, retain)SimpleDuckFactory *factory;
- (void)orderDuck:(int)type;
- (id)initWithFactory:(SimpleDuckFactory *)aFactory;
@end
//
// DuckStore.m
// SimpleFactory
//
// Created by Robin on 3/12/13.
// Copyright (c) 2013 Robin. All rights reserved.
//
#import "DuckStore.h"
@implementation DuckStore
@synthesize factory = _factory;
- (void)dealloc
{
[_factory release];
[super dealloc];
}
- (void)orderDuck:(int)type
{
Duck *tmpDuck = nil;
tmpDuck = [self.factory createDuckWithType:type];
if (tmpDuck) {
[tmpDuck behavior];
}
}
- (id)initWithFactory:(SimpleDuckFactory *)aFactory
{
if (self = [super init]) {
self.factory = aFactory;
}
return self;
}
@end
//
// SimpleDuckFactory.h
// SimpleFactory
//
// Created by Robin on 3/12/13.
// Copyright (c) 2013 Robin. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Duck.h"
@interface SimpleDuckFactory : NSObject
- (Duck *)createDuckWithType:(int)type;
@end
//
// SimpleDuckFactory.m
// SimpleFactory
//
// Created by Robin on 3/12/13.
// Copyright (c) 2013 Robin. All rights reserved.
//
#import "SimpleDuckFactory.h"
#import "RedDuck.h"
#import "BlueDuck.h"
@implementation SimpleDuckFactory
- (Duck *)createDuckWithType:(int)type
{
Duck *duck = nil;
switch (type) {
case 1:
duck = [[[RedDuck alloc]init]autorelease];
break;
case 2:
duck = [[[BlueDuck alloc]init]autorelease];
break;
default:
break;
}
return duck;
}
@end
//
// Duck.h
// SimpleFactory
//
// Created by Robin on 3/12/13.
// Copyright (c) 2013 Robin. All rights reserved.
//
#import <Foundation/Foundation.h>
//abstract class
@interface Duck : NSObject
{
NSString *_name;
}
@property (nonatomic, retain) NSString *name;
- (void)behavior;
@end
//
// Duck.m
// SimpleFactory
//
// Created by Robin on 3/12/13.
// Copyright (c) 2013 Robin. All rights reserved.
//
#import "Duck.h"
@implementation Duck
@synthesize name = _name;
- (void)dealloc
{
[_name release];
[super dealloc];
}
//abstract method subclass must implentment it
- (void)behavior
{
[self doesNotRecognizeSelector:_cmd];
}
@end
//
// BlueDuck.h
// SimpleFactory
//
// Created by Robin on 3/12/13.
// Copyright (c) 2013 Robin. All rights reserved.
//
#import "Duck.h"
@interface BlueDuck : Duck
@end
//
// BlueDuck.m
// SimpleFactory
//
// Created by Robin on 3/12/13.
// Copyright (c) 2013 Robin. All rights reserved.
//
#import "BlueDuck.h"
@implementation BlueDuck
- (id)init
{
if (self = [super init]) {
self.name = @"Blue";
}
return self;
}
- (void)behavior
{
NSLog(@"I am blue and name is %@",self.name);
}
@end
//
// RedDuck.h
// SimpleFactory
//
// Created by Robin on 3/12/13.
// Copyright (c) 2013 Robin. All rights reserved.
//
#import "Duck.h"
@interface RedDuck : Duck
@end
//
// RedDuck.m
// SimpleFactory
//
// Created by Robin on 3/12/13.
// Copyright (c) 2013 Robin. All rights reserved.
//
#import "RedDuck.h"
@implementation RedDuck
- (id)init
{
if (self = [super init]) {
self.name = @"Red";
}
return self;
}
- (void)behavior
{
NSLog(@"I am red and name is %@",self.name);
}
@end