您的位置:首页 > 编程语言 > Java开发

iOS与java工厂设计模式,欢迎加二维码讨论

2014-10-20 11:22 267 查看
什么是工厂模式

什么时候用工厂模式

工厂模式有那些优缺点

oc与java语法上工厂模式有那些异同及简单的例子

什么是工厂模式

在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。工厂方法要解决的问题是对象的创建时机,它提供了一种扩展的策略,很好地符合了开放封闭原则。工厂方法也叫做虚构造器(Virtual Constructor)。

定义是一个概括,可能比较难懂,其实他就是为了创建对象的,先不要着急慢慢看下去再回来看定义就会豁然开朗。

什么时候用工厂模式

(1)编译时无法确定预期要创建的对象的类;

(2)类想让其子类决定运行时创建什么;

(3)类有若干辅助类为其子类,而你想将返回哪个子类这一信息局部化。

工厂设计模式是面向对象软件设计中应用非常普遍的设计模式。工厂方法从代码中消除了对应用程序特有的耦合。代码只需要处理Product抽象接口。所以同一代码得以复用,在应用程序中与用户定义的任何ConcreteProduct类(具体工厂)一起工作。

我们看一下工厂模式的通用类图:



抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。

抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。

具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

oc与java语法上工厂模式有那些异同及简单的例子

我们还是通过例子来看更直观一些:假如易车某个部门有两款产品,他们都是DSA系统,只是里面的素材各有不同,而且他们都是从DSA3.1一个通用的产品,他么要提供给不同的经销商厂商,我们这里模拟一下;

IOS:

一定一个product类

@interface DSAProduct :

NSObject

-(void) myName;

@end

看一下myName的实现

-(void)myName

{

NSLog(@"我是DSA产品");

}

还有相应的子类 我们这里不做任何操作,主要说明工厂模式本身

@interface AudiDSAProduct :

DSAProduct

-(void) myName;

@end

-(void)myName

{

NSLog(@"我是AudiDSA产品");

}

@interface BMWDSAProduct :

DSAProduct

-(void) myName;

@end

-(void)myName

{

NSLog(@"我是BMWDSA产品");

}

接下来是工厂方法

@interface DSAFactory :

NSObject

-(DSAProduct *) factoryMethod;

@end

@implementation

DSAFactory

-(DSAProduct *)factoryMethod

{

//
在此处,子类必须重写factoryMethod方法。当然,在工厂模式中,也可以在此处返回一个默认的Product。

return
nil;

}

@end

具体的工厂

@interface AudiFactory : DSAFactory

@end

@implementation

AudiFactory

-(DSAProduct *)factoryMethod

{

return
[[AudiDSAProduct
alloc]
init];

}

@interface BMWFactory : DSAFactory

@end

@implementation BMWFactory

-(DSAProduct *)factoryMethod

{

return [[BMWDSAProduct alloc] init];

}

@end

我们看一下场景类的实现

//
工厂方法的实例化

DSAFactory *audifactory = [[AudiFactory

alloc]
init];

DSAFactory *bmwfactory
= [[BMWFactory

alloc]
init];

//
通过工厂方法实例化相应的产品

DSAProduct *myproduct = [audifactory

factoryMethod];

[myproduct Myname];

DSAProduct *myproduct
= [bmwfactory

factoryMethod];

[myproduct Myname];

系统会分别打印 我是AudiDSA产品
我是BMWDSA产品,这样写的好处 就是减少了代码的耦合,java里面有一个Spring框架,他就是为了解决耦合,而且他已经帮助我们实现了工厂方法。

简单的说一下java的工厂方法:我们说一下通用的模版
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15
public abstract class Product {

//产品类的公共方法

public void method1(){

//业务逻辑处理

}

//抽象方法

public abstract void method2();

}
具体的产品类可以有多个,都继承于抽象产品类,其源代码如代码清单8-9所示。

代码清单8-9 具体产品类
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19
public class ConcreteProduct1 extends Product {

public void method2() {

//业务逻辑处理

}

}

public class ConcreteProduct2 extends Product {

public void method2() {

//业务逻辑处理

}

}
抽象工厂类负责定义产品对象的产生,源代码如代码清单8-10所示。

代码清单8-10 抽象工厂类
1

2

3

4

5

6

7

8

9

10

11

12

13
public

abstract
class
Creator {


/*


* 创建一个产品对象,其输入参数类型可以自行设置


* 通常为String、Enum、Class等,当然也可以为空


*/


public

abstract
Product createProduct(Class<?
extends

Product> c);


}

具体如何产生一个产品的对象,是由具体的工厂类实现的,如代码清单8-11所示。

代码清单8-11 具体工厂类

public
class
ConcreteCreator
extends
Creator
{


public
Product createProduct(Class<?
extends
Product>
c) {


Product product=
null
;


try
{


product = (Product)Class.forName(c.getName()).newInstance();


}
catch
(Exception
e) {


//异常处理


}


return
product;


}


}


场景类的调用方法如代码清单8-12所示。

代码清单8-12 场景类

public
class
Client
{


public
static
void
main(String[]
args) {


Creator creator =
new
ConcreteCreator();


Product product = creator.createProduct(ConcreteProduct1.
class
);


/*


* 继续业务处理


*/


}


欢迎加入iOS与大数据进行讨论:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: