iOS:個人淺談工廠模式

一、什么是工廠方法?

正式的解釋是:在基類中定義創建對象的一個接口,讓子類決定實例化哪個類。工廠方法讓一個類的實例化延遲到子類中進行。工廠方法要解決的問題是對象的創建時機,它提供了一種擴展的策略,很好地符合了開放封閉原則。工廠方法也叫做虛構造器(Virtual Constructor)。

個人的拙見是:通過工廠方法創建工廠對象,然后在工廠類中定義創建基類的子類對象的方法并通過外部傳入的條件判斷去創建哪一個子類對象,不過由于OC是運行時語言,所以工廠類雖然提供了創建子類對象的方法,但是在編譯時期并不能確定對象類型,編譯時期創建的子類對象類型是基類類型,真正的類型在運行時期由子類來確定,也即此時確定為子類類型。

?

二、工廠方法的實現條件?

(1)存在繼承關系

(2)運用了多態的特性

?

三、工廠方法的優缺點?

優點:極大地優化了代碼,如果需要100個子類對象,不用再一直調用alloc方法去創建,而是直接通過其工廠類的一句代碼即可實現,提高了對代碼的復用性。同時,也可以將大量的操作放到工廠類中去處理,業務類中只負責去調用創建需要的對象即可。

缺點:因為它的實現條件之一必須存在繼承關系,所以模式中工廠類集中了所有的創建邏輯,形成一個龐大的全能類,當所有的類不是繼承自同一個父類的時候擴展比較困難。

?

四、創建一個簡單的工廠方法如下

工廠類:PersonFactory

復制代碼
//  PersonFactory.h
//
//  Created by 夏遠全 on 16/12/23.
//  Copyright ? 2016年 廣州市東德網絡科技有限公司. All rights reserved.
//

#import <Foundation/Foundation.h>extern NSString *TeacherClassName;
extern NSString *StudentClassName;@class Person;
@interface PersonFactory : NSObject/***  定義的一個創建子類對象的接口,通過傳入的類名稱創建對應的子類對象**  @param className                類名稱*  @param callBlcok                回調,返回創建的子類對象,此時接收子類對象的類型Person類型*/
-(void)createObject:(NSString *)className compelete:(void (^)(Person *object))callBlcok;@end
復制代碼
復制代碼
//  PersonFactory
//
//  Created by 夏遠全 on 16/12/23.
//  Copyright ? 2016年 廣州市東德網絡科技有限公司. All rights reserved.
//

#import "PersonFactory.h"
#import "Person.h"
#import "Teacher.h"
#import "Student.h"NSString *TeacherClassName = @"Teacher";
NSString *StudentClassName = @"Student";@implementation PersonFactory-(void)createObject:(NSString *)className compelete:(void (^)(Person *object))callBlcok{if ([className isEqualToString:NSStringFromClass([Teacher class])]) {//創建教師類對象Teacher *teacher = [[Teacher alloc] init];//回調
        callBlcok(teacher);//教書
        [teacher teachStudent];}if ([className isEqualToString:NSStringFromClass([Student class])]) {//創建學生類的對象Student *student = [[Student alloc] init];//回調
        callBlcok(student);//學習
        [student learnKnowledge];}
}@end
復制代碼

基類:Person(里面提供的方法都被子類重寫)

復制代碼
//  Person.h
//
//  Created by 夏遠全 on 16/12/23.
//  Copyright ? 2016年 廣州市東德網絡科技有限公司. All rights reserved.
//

#import <Foundation/Foundation.h>@interface Person : NSObject/***  打印類名*/
-(void)printClassName;@end
復制代碼
復制代碼
//
//  Person.m
//
//  Created by 夏遠全 on 16/12/23.
//  Copyright ? 2016年 廣州市東德網絡科技有限公司. All rights reserved.
//

#import "Person.h"@implementation Person-(void)printClassName{}@end
復制代碼

子類教師類:Teacher(重寫基類方法的同時,也可以定義屬于自己的新的方法)

復制代碼
//  Teacher.h
//
//  Created by 夏遠全 on 16/12/23.
//  Copyright ? 2016年 廣州市東德網絡科技有限公司. All rights reserved.
//

#import "Person.h"@interface Teacher : Person/***  教師的行為*/
-(void)teachStudent;
@end
復制代碼
復制代碼
//  Teacher.m
//
//  Created by 夏遠全 on 16/12/23.
//  Copyright ? 2016年 廣州市東德網絡科技有限公司. All rights reserved.
//

#import "Teacher.h"@implementation Teacher-(void)printClassName{NSLog(@"%@---%@",NSStringFromClass([self class]),self);
}-(void)teachStudent{NSLog(@"teach student");
}@end
復制代碼

子類學生類:Student(重寫基類方法的同時,也可以定義屬于自己的新的方法)

復制代碼
//  Student.h
//
//  Created by 夏遠全 on 16/12/23.
//  Copyright ? 2016年 廣州市東德網絡科技有限公司. All rights reserved.
//

#import "Person.h"@interface Student : Person/***  學生的行為*/
-(void)learnKnowledge;@end
復制代碼
復制代碼
//  Student.m
//
//  Created by 夏遠全 on 16/12/23.
//  Copyright ? 2016年 廣州市東德網絡科技有限公司. All rights reserved.
//

#import "Student.h"@implementation Student-(void)printClassName{NSLog(@"%@---%@",NSStringFromClass([self class]),self);
}-(void)learnKnowledge{NSLog(@"learnKnowledge");
}@end
復制代碼

main.m演示如下:

復制代碼
//  main.m
//  PersonFactory
//
//  Created by 夏遠全 on 16/12/23.
//  Copyright ? 2016年 廣州市東德網絡科技有限公司. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "PersonFactory.h"
#import "Person.h"
#import "Teacher.h"
#import "Student.h"int main(int argc, const char * argv[]) {@autoreleasepool {//創建工廠對象PersonFactory *personFactory = [[PersonFactory alloc] init];//連續創建Person的子類教師類對象for (int i=0; i<5; i++) {[personFactory createObject:TeacherClassName compelete:^(Person *object) {[object printClassName];}];}//連續創建Person的子類學生類對象for (int i=0; i<5; i++) {[personFactory createObject:StudentClassName compelete:^(Person *object) {[object printClassName];}];}}return 0;
}
復制代碼

打印結果:

復制代碼
2016-12-23 21:58:51.235 PersonFactory[8896:442793] Teacher---<Teacher: 0x100f01660>
2016-12-23 21:58:51.237 PersonFactory[8896:442793] teach student
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Teacher---<Teacher: 0x103800100>
2016-12-23 21:58:51.237 PersonFactory[8896:442793] teach student
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Teacher---<Teacher: 0x100c005c0>
2016-12-23 21:58:51.237 PersonFactory[8896:442793] teach student
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Teacher---<Teacher: 0x100c00550>
2016-12-23 21:58:51.237 PersonFactory[8896:442793] teach student
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Teacher---<Teacher: 0x100c00180>
2016-12-23 21:58:51.237 PersonFactory[8896:442793] teach student
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Student---<Student: 0x100a00020>
2016-12-23 21:58:51.237 PersonFactory[8896:442793] learnKnowledge
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Student---<Student: 0x100a02880>
2016-12-23 21:58:51.237 PersonFactory[8896:442793] learnKnowledge
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Student---<Student: 0x103900000>
2016-12-23 21:58:51.237 PersonFactory[8896:442793] learnKnowledge
2016-12-23 21:58:51.237 PersonFactory[8896:442793] Student---<Student: 0x103800220>
2016-12-23 21:58:51.238 PersonFactory[8896:442793] learnKnowledge
2016-12-23 21:58:51.238 PersonFactory[8896:442793] Student---<Student: 0x103800230>
2016-12-23 21:58:51.238 PersonFactory[8896:442793] learnKnowledge
Program ended with exit code: 0
復制代碼

本人原創,此處是自己對知識的回爐,如果理解有誤,請大家不吝賜教,對我進行斧正。

?

程序猿神奇的手,每時每刻,這雙手都在改變著世界的交互方式!

本文轉自當天真遇到現實博客園博客,原文鏈接:http://www.cnblogs.com/XYQ-208910/p/6216246.html,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540458.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540458.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540458.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

scanf 輸入十六進制_使用C語言中的scanf()在字符變量中輸入十進制,八進制和十六進制值...

scanf 輸入十六進制Here, we will declare an unsigned char variable and input different formats value like decimal format, octal format and hexadecimal format. 在這里&#xff0c;我們將聲明一個無符號的char變量&#xff0c;并輸入不同格式的值&#xff0c;例如十進…

[轉載] Python中pass的作用

參考鏈接&#xff1a; 如何在Python中編寫空函數&#xff1f;請使用 pass語句 空語句 do nothing保證格式完整保證語義完整 以if語句為例&#xff0c;在c或c/java中&#xff1a; if(true) ; //do nothing else { //do something } 對應于python就要這樣寫&#xff…

wrf 嵌套網格作用_在網格系統中使用響應列,嵌套列和偏移列 引導程序

wrf 嵌套網格作用介紹 (Introduction) In the previous article, we have learnt what is grid and grid system and how it works? Now, we will learn about how Responsive column, Nesting Columns and Offset Columns works and how to use them? If you have any doubt…

[看書筆記]《深入java虛擬機》——java體系結構(二)

java虛擬機的三種含義&#xff1a; - 抽象的規范 - 一個具體的實現 - 一個運行中的虛擬機實例 ---------------------java虛擬機的生命周期&#xff1a; java虛擬機實例的天職就是負責運行一個java程序。 啟動一個java程序&#xff0c;一個虛擬機實例誕生了&#xff1b;程序關閉…

[轉載] 【零基礎學爬蟲】python中的yield詳解

參考鏈接&#xff1a; 什么時候在Python中使用yield而不是return python中的yield功能比較強大&#xff0c;什么意思呢&#xff1f;如果一個函數f內使用了yield關鍵詞&#xff0c;那么該函數就可以這樣使用&#xff1a; for item in f(***): **** 也就是包含yield關鍵詞的函…

全新的membership框架Asp.net Identity(1)——.Net membership的歷史

在Asp.net上&#xff0c;微軟的membershop框架經歷了Asp.net membership到Asp.net simple membership&#xff0c;再到現在的Asp.net Identity. 每一次改變&#xff0c;都使得驗證框架更加的適應變化和可定制。這篇文章是Asp.net Identity系列的開篇&#xff0c;主要就membersh…

c語言100位整數變量聲明_C ++程序動態聲明一個整數變量并打印其內存地址

c語言100位整數變量聲明Here, we will learn how we can declare an integer variable dynamically and how to print address of declared memory block? 在這里&#xff0c;我們將學習如何動態聲明整數變量&#xff0c;以及如何打印聲明的內存塊的地址&#xff1f; In C pr…

[轉載] python 函數返回多個值

參考鏈接&#xff1a; 在Python中返回多個值 &#xff08;廖雪峰Python教程學習筆記&#xff09; 函數體內部的語句在執行時&#xff0c;一旦執行到return&#xff0c;函數就執行完畢&#xff0c;并將結果返回。 如果沒有return語句&#xff0c;函數執行完畢后也會返回結果…

二.編寫第一個c#程序(注釋,命名空間,類,Main方法,標識符,關鍵字,輸入,輸出語句,)...

復習編寫一個控制臺應用程序&#xff0c;目標是在控制臺輸出“Hello World” 1.第一步&#xff0c;打開Visual Studio 2012以上版本(我用的是VS 2015)&#xff0c;打開完成后出現以下界面 2.第二步&#xff0c;這時候就要新建一個解決方案了&#xff0c;創建解決方案可以直接點…

[轉載] Python中定義函數,循環語句,條件語句

參考鏈接&#xff1a; Python中的局部函數 由于日常程序流中主要是三種結構&#xff1a;順序&#xff0c;循環&#xff0c;條件&#xff0c;且往往需要自定義函數再調用&#xff0c; 因此今天想學習一下Python中關于定義函數、循環語句和條件語句的寫法。 1.定義函數 區…

node oauth2驗證_如何設置和使用護照OAuth Facebook身份驗證(第1部分)| Node.js

node oauth2驗證In my last articles, we looked at the implementation of the passport-local authentication strategy. We also looked at the various requirements to get started with the login form. 在上一篇文章中&#xff0c;我們介紹了護照本地身份驗證策略的實現…

vue2.0 引用qrcode.js實現獲取改變二維碼的樣式

vue代碼 <template><div class"qart"><div id"qrcode" ref"qrcode"></div><input type"text" id"getval" value"" placeholder"修改這個值改變二維碼"></div> <…

[轉載] Python列表排序 list.sort方法和內置函數sorted

參考鏈接&#xff1a; Python中的函數 Python列表排序 list.sort方法和內置函數sorted 很多時候我們獲取到一個列表后,這個列表并不滿足我們的需求,我們需要的是一個有特殊順序的列表. 這時候就可以使用list.sort方法和內置函數sorted,本文就是介紹list.sort方法和sorted內…

Java Thread類最終同步的void join(long time_in_ms)方法,帶有示例

線程類最終同步無效連接(long time_in_ms) (Thread Class final synchronized void join(long time_in_ms)) This method is available in package java.lang.Thread.join(long time_in_ms). 軟件包java.lang.Thread.join(long time_in_ms)中提供了此方法。 join(long time_in_…

RYU控制器安裝`

2019獨角獸企業重金招聘Python工程師標準>>> 同樣是參考了http://linton.tw/2014/02/11/note-how-to-set-up-ryu-controller-with-gui-component/的內容。 1. 由于Ubuntu中自帶有Python&#xff0c;因此直接開始安裝pip apt-get install python-pip apt-get i…

[轉載] mac開發者,你不得不知道的環境變更設置方法(如Java的環境變更 source命令 )

參考鏈接&#xff1a; 設置Java環境 Mac是基于Unix的&#xff0c;所有先來幾個常識與命令&#xff1a; Unix中雙引號單引號反引號(" )的區別 Unix中雙引號起到“弱引用”的作用:被引用的字符大部分被按照字符字面的意思解釋執行&#xff0c;除了了$,\,字符除外。 [因…

人形機器人正在美國史密森尼博物館中擔任導游的工作

Te article has been removed, please visit IncludeHelps home page for more articles 該文章已被刪除&#xff0c;請訪問IncludeHelp的主頁以獲取更多文章翻譯自: https://www.includehelp.com/News/a-humanoid-robot-is-doing-the-job-of-a-guide-in-the-smithsonian-museu…

normalizr API

APInormalizedenormalizeschemaArrayEntityObjectUnionValuesnormalize(data, schema)Normalizes input data per the schema definition provided. 根據提供的schema定義規范化輸入數據。data: required Input JSON (or plain JS object) data that needs normalization.schem…

[轉載] 【Java】基礎06:HelloWorld入門程序

參考鏈接&#xff1a; 從Hello World示例開始Java編程 HelloWorld它的中文意思是&#xff1a;“你好&#xff0c;世界”。 仿佛代表著計算機對世界說出來的第一句話&#xff0c;因為它簡潔實用&#xff0c;所以被作為入門程序廣泛使用。 Java程序開發三步驟&#xff1a;編…

[轉載] Java中的命名參數

參考鏈接&#xff1a; Java命名約定 創建具有許多參數的方法是一個主要的缺點。 每當需要創建這樣的方法時&#xff0c;就在空氣中聞一聞&#xff1a;這是代碼的味道。 強化單元測試&#xff0c;然后進行重構。 沒有借口&#xff0c;沒有屁股。 重構&#xff01; 使用構建器模…