• Objective-C设计模式——工厂方法模式virtual constructor(对象创建)


    工厂方法模式

    工厂方法模式可以控制对象的创建过程,屏蔽对象创建的细节,可以直接创建出我们所需要的已经配置好的对象。

    工厂方法模式定义了创建方法的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的实例化延迟到其子类。

    工厂方法的工厂其实是多太的一个经典应用,而其生产的产品取决于使用什么工厂,符合面向对象设计的开放封闭原则,添加产品只需要添加新的类,而不需要修改原有的代码。

    使用场景

    1.编译时无法准确预期要创建的对象的类;

    2.类想让其子类决定在运行时创见什么;

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

    举个最简单的例子,NSNumber这个类,可以使用[[NSNumber alloc] init]来创建实例,但是并没有什么用,除非使用预先定义的工厂方法才有用,

    例如:[NSNumber numberWithBool:YES]消息会得到NSNumber的子类NSCFBoolean的一个实例。

    创建对象的安全方法

    因为客户端并不需要创建对象的实现细节,细节都会在工厂方法中得到实现,并且返回最终的产品,如果想要添加新的产品,不需要修改客户端接口,只需要修改工厂方法即可。

    对象工厂方法和类工厂方法

    个人觉得类工厂方法其实就是简单工厂的一种体现,只需要调用不同的方法或者传递不同的参数来实例化不同的子类。但是这种方法每次添加新产品时都要在抽象类中添加对应的方法,并不符合开放封闭原则,对象工厂方法模式只需要添加新的类就可以实现我们想要的效果。

    Demo

    内容比较多:

    工厂类


    #import
    <Foundation/Foundation.h> @interface Factory : NSObject -(id)createProduct; @end #import "Factory.h" #import "Product.h" @implementation Factory -(id)createProduct{ return [[Product class] new]; } @end

    #import "Factory.h"
    
    @interface FactoryType1 : Factory
    
    @end
    
    
    #import "FactoryType1.h"
    #import "ProductType1.h"
    @implementation FactoryType1
    
    -(id)createProduct{
        return [[ProductType1 class] new];
    }
    
    @end
    
    #import "Factory.h"
    
    @interface FactoryType2 : Factory
    
    @end
    
    #import "FactoryType2.h"
    #import "ProductType2.h"
    
    @implementation FactoryType2
    
    -(id)createProduct{
        return [[ProductType2 class] new];
    }
    
    @end

    产品类

    #import <Foundation/Foundation.h>
    
    @interface Product : NSObject
    
    @property(nonatomic, strong) NSString *name;
    
    @end
    
    #import "Product.h"
    
    @implementation Product
    
    -(id)init{
        if(self){
            _name = @"product";
        }
        return self;
    }
    
    @end
    
    #import "Product.h"
    
    @interface ProductType1 : Product
    
    @end
    
    #import "ProductType1.h"
    
    @implementation ProductType1
    
    -(id)init{
        if(self){
            self.name = @"productType1";
        }
        return self;
    }
    
    @end
    
    #import "Product.h"
    
    @interface ProductType2 : Product
    
    @end
    
    #import "ProductType2.h"
    
    @implementation ProductType2
    
    -(id)init{
        if(self){
            self.name = @"productType2";
        }
        return self;
    }
    
    @end

    客户端:

            Factory *factory1 = [FactoryType1 new];
            Product *product1 = [factory1 createProduct];
            NSLog(@"%@",product1.name);
            
            Factory *factory2 = [FactoryType2 new];
            Product *product2 = [factory2 createProduct];
            NSLog(@"%@",product2.name);
            return 0;
            /*
             *2015-07-19 22:11:13.590 Factory Methods[32054:8351400] productType1
             *2015-07-19 22:11:13.591 Factory Methods[32054:8351400] productType2
             */

    可以看到,打印结果,我们只改变了初始化子类,对应就产生出了不同的产品。

    对于类工厂方法就不做演示了,可以参看NSNumber

  • 相关阅读:
    美国地质调研局USGS
    SAR 图像
    Matlab 之meshgrid, interp, griddata 用法和实例
    ENVISAT卫星及ASAR数据介绍
    ASP.NET Integration with IIS7
    ubuntu下C/C++基本开发环境的配置
    C++ Objects Part 1: Basic Object Memory Layout
    Socket Programming in Windows
    Memory Layout for Multiple and Virtual Inheritance
    Common Type System—Memory Layout at C# Online.NET
  • 原文地址:https://www.cnblogs.com/madpanda/p/4659975.html
Copyright © 2020-2023  润新知