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

来源:互联网 发布:三a甲级数据分析事务所 编辑:程序博客网 时间:2024/06/14 17:00
  1. 什么是工厂模式

  2. 什么时候用工厂模式

  3. 工厂模式有那些优缺点

  4. 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

@implementationDSAFactory


-(DSAProduct *)factoryMethod

{

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

returnnil;

}

@end

具体的工厂

@interface AudiFactory : DSAFactory


@end

@implementationAudiFactory

-(DSAProduct *)factoryMethod

{

return [[AudiDSAProductalloc]init];

}


@interface BMWFactory : DSAFactory


@end

@implementation BMWFactory

-(DSAProduct *)factoryMethod

{

return [[BMWDSAProduct allocinit];

}

@end

我们看一下场景类的实现

//工厂方法的实例化

DSAFactory *audifactory = [[AudiFactoryalloc] init];

DSAFactory *bmwfactory = [[BMWFactoryalloc] init];

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

DSAProduct *myproduct = [audifactoryfactoryMethod];

myproduct Myname];

DSAProduct *myproduct = [bmwfactoryfactoryMethod];

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

publicabstract class Creator {


/*


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


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


*/


publicabstract Product createProduct(Class<? extendsProduct> 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与大数据进行讨论:

0 0
原创粉丝点击