博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[设计模式]工厂方法模式
阅读量:6433 次
发布时间:2019-06-23

本文共 2789 字,大约阅读时间需要 9 分钟。

简介


工厂方法模式 (Factory Method)定义一个用于创建对象的接口,让
子类决定实例化哪一个类。工厂方法使一个类的实例化
延迟到其他子类。 
工厂模式是一种
类创建型模式 (
可参考 
)。

结构


图-工厂方法模式结构图

Product : 定义产品对象的接口。

abstract 
class Product {
    
public 
abstract 
void Use();
}

ConcreteProduct : 实现 Product 接口。

class ConcreteProduct 
extends Product {
    
public ConcreteProduct() {
        System.out.println("创建 ConcreteProduct 产品");
    }
    @Override
    
public 
void Use() {
        System.out.println("使用 ConcreteProduct 产品");
    }
}

Creator : 声明工厂方法,它会返回一个产品类型的对象。 Creator 也可以实现一个默认的工厂方法 FactoryMethod() ,以返回一个默认的具体产品类型。

interface Creator {
    
public Product FactoryMethod();
}

ConcreteCreator 覆写 Creator 中的工厂方法 FactoryMethod() 。

class ConcreteCreator 
implements Creator {
    @Override
    
public Product FactoryMethod() {
        
return 
new ConcreteProduct();
    }
}

测试代码

public 
class FactoryMethodPattern {
    
public 
static 
void main(String[] args) {
        Creator factory = 
new ConcreteCreator();
        Product product = factory.FactoryMethod();
        product.Use();
    }
}

运行结果

创建 ConcreteProduct 产品
使用 ConcreteProduct 产品

 

动机


当一个类不知道它所必须创建的对象的类的时候。

当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将是代理者的帮助子类的信息局部化的时候。

要点


1、工厂模式中,增加一种产品类,就要增加一个工厂类。

因为每个工厂类只能创建一种产品的实例。

2、工厂模式遵循开放-封闭原则。

工厂模式中,新增一种产品并不需要修改原有类,仅仅是扩展。 

 

实例


还是以  里的例子来进行说明。

如何实现一个具有加减乘除基本功能的计算器? 

两种模式的 Product 和 ConcreteProduct 角色代码没有区别,不再赘述。

差异在于 Factory 角色部分,以及客户端部分,请在代码中体会。 

Creator 角色

//
 Creator 角色,定义返回产品实例的公共工厂方法
interface OperationFactory {
    
public Operation FactoryMethod();
}

ConcreteCreator 角色

和简单工厂模式相比,每一种产品都会有一个具体的工厂类负责生产实例。

//
 ConcreteCreator 角色,具体实现 Creator 中的方法
class AddFactory 
implements OperationFactory {
    @Override
    
public Operation FactoryMethod() {
        
return 
new Add();
    }
}
//
 ConcreteCreator 角色,具体实现 Creator 中的方法
class SubFactory 
implements OperationFactory {
    @Override
    
public Operation FactoryMethod() {
        
return 
new Sub();
    }
}
//
 ConcreteCreator 角色,具体实现 Creator 中的方法
class MulFactory 
implements OperationFactory {
    @Override
    
public Operation FactoryMethod() {
        
return 
new Mul();
    }
}
//
 ConcreteCreator 角色,具体实现 Creator 中的方法
class DivFactory 
implements OperationFactory {
    @Override
    
public Operation FactoryMethod() {
        
return 
new Div();
    }
}

Client 角色

与简单工厂模式中无需关注具体创建不同,工厂模式中需要指定具体工厂,以负责生产具体对应的产品。

//
 Client 角色,需要指定具体工厂,以负责生产具体产品
public 
class FactoryMethodPattern {
    
public 
static 
void main(String[] args) {    
        OperationFactory factory = 
new SubFactory();
        Operation oper = factory.FactoryMethod();
        oper.numA = 3;
        oper.numB = 2;
        
double result = oper.getResult();
        System.out.println("result = " + result);
    }
}

C++版工厂方法模式

以下为一个C++版的工厂方法模式例子。

假设有两个台灯制造工厂,一个专门生产红色的灯,一个专门生产蓝色的灯。

在客户端里,我们实例化蓝灯工厂,来生产一个蓝灯。

View Code

 

简单工厂模式 vs. 工厂方法模式

简单工厂模式相比于工厂方法模式

优点:工厂类中包含必要的逻辑判断,可根据客户端的选择条件动态实例化需要的类。对于客户端来说,去除了对具体产品的依赖。

缺点:违背了开放封闭原则。 每添加一个新的产品,都需要对原有类进行修改。增加维护成本,且不易于维护。

开发封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
本文转自静默虚空博客园博客,原文链接:http://www.cnblogs.com/jingmoxukong/p/4016173.html,如需转载请自行联系原作者
你可能感兴趣的文章
开机就提示“请安装TCP/IP协议,error=10106”的解决的方法
查看>>
hdu-----(1151)Air Raid(最小覆盖路径)
查看>>
实现开启和关闭android移动网络(转)
查看>>
【BZOJ】1621: [Usaco2008 Open]Roads Around The Farm分岔路口(dfs)
查看>>
第12届北师大校赛热身赛第二场 C. 组合数
查看>>
spin_lock & mutex_lock的差别?
查看>>
Java-hibernate的映射文件
查看>>
【原】使用Json作为Python和C#混合编程时对象转换的中间文件
查看>>
适配iPhone6和iPhone6 Plus
查看>>
深入探讨this指针
查看>>
ExtJs自学教程(1):一切从API開始
查看>>
Nginx+keepalived做双机热备加tomcat负载均衡
查看>>
myeclipse 配置
查看>>
由七芒星引出来的——关于142857
查看>>
与其说我害怕成为普通人,还不如说我害怕生活,害怕找不到一种自己喜欢的方式去度过人生...
查看>>
制作iis自动安装包
查看>>
关于控制台程序下使用mfc库中的函数时断言
查看>>
Handling events in an MVVM WPF application
查看>>
在Ubuntu上下载、编译和安装Android最新源代码
查看>>
[转]JavaScriptSerializer中日期序列化
查看>>