-
什么是工厂模式
-
什么时候用工厂模式
-
工厂模式有那些优缺点
-
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 | |
具体如何产生一个产品的对象,是由具体的工厂类实现的,如代码清单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与大数据进行讨论: