首页 > 代码库 > 《大话设计模式》ruby版代码:工厂方法模式
《大话设计模式》ruby版代码:工厂方法模式
一,先看看简单工厂模式
简单工厂模式的优点:工厂类中包含了必要的逻辑判断,根据客户端的选择动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
简单工厂模式的缺点:增加功能的时候,就需要增加case的条件分支,也就是要修改工厂类,违背了“开放-封闭原则”。
2,工厂方法模式:
# -*- encoding: utf-8 -*-#运算类class Operation attr_accessor :number_a,:number_b def initialize(number_a = nil, number_b = nil) @number_a = number_a @number_b = number_b end def result 0 endend#加法类class OperationAdd < Operation def result number_a + number_b endend#减法类class OperationSub < Operation def result number_a - number_b endend#乘法类class OperationMul < Operation def result number_a * number_b endend#除法类class OperationDiv < Operation def result raise ‘除数不能为0‘ if number_b == 0 number_a / number_b endendmodule FactoryModule def create_operation endend#加法工厂class AddFactory include FactoryModule def create_operation OperationAdd.new end end#减法工厂class SubFactory include FactoryModule def create_operation OperationSub.new endend#乘法工厂class MulFactory include FactoryModule def create_operation OperationMul.new end end#除法工厂class DivFactory include FactoryModule def create_operation OperationDiv.new end endfactory = AddFactory.newoper = factory.create_operationoper.number_a = 1oper.number_b = 2p oper.result
相比于简单工厂模式,这里的变化是移除了工厂类,取而代之的是具体的运算工厂,分别是加法工厂、减法工厂、乘法工厂和除法工厂。
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到了子类。
工厂方法模式实现时,客户端决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在,也就是说,工厂方法把简单工厂的内部逻辑判断转移到了客户端代码来进行。想要增加功能,本来是修改工厂类,现在是修改客户端。
这么做的好处是,克服了简单工厂违背“开放-封闭原则”的缺点,又保持了封装对象创建过程的优点。
存在的问题是逻辑分支的判断依然需要实现,只不过是从工厂类中转移到了客户端,利用”反射“可以解决分支判断的问题。
《大话设计模式》ruby版代码:工厂方法模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。