iOS与java工厂设计模式,欢迎加二维码讨论
来源:互联网 发布:三a甲级数据分析事务所 编辑:程序博客网 时间:2024/06/14 17:00
什么是工厂模式
什么时候用工厂模式
工厂模式有那些优缺点
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 alloc] init];
}
@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
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与大数据进行讨论:
- iOS与java工厂设计模式,欢迎加二维码讨论
- Java设计模式--简单工厂模式与抽象工厂模式
- Java与设计模式-抽象工厂模式
- iOS 关于 设计模式 与网友讨论实录
- iOS设计模式--工厂模式
- iOS 设计模式 - 工厂模式
- iOS设计模式-------《工厂模式》
- iOS与设计模式一:继承、简单工厂模式
- JAVA设计模式(二)工厂模式与观察者模式
- java 设计工厂模式
- Java 工厂模式设计
- JAVA工厂设计模式
- JAVA 工厂设计模式
- java工厂设计模式
- Java工厂设计模式
- java工厂设计模式
- Java 工厂模式设计
- java工厂设计模式
- 个人总结openflow与controller
- Python循环语句(while)
- Android ADB的使用方法
- Android NDK的C++11标准支持
- 一些常用的Bootstrap模板资源站
- iOS与java工厂设计模式,欢迎加二维码讨论
- 第八周项目2:加班费,要不要?
- 【iOS开发-59】LOL案例:单组tabView、alertView样式、实现监听,以及用reloadData数据刷新
- [struts2学习笔记] 第一节 关于struts2的简单认知
- Android判断屏幕锁屏的方法总结
- c++ 面试 COM 组件
- C#操作Excel总结
- 个人总结OVS中VxLAN的schema组织结构
- 第8周项目5-定期存款利息计算器