多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 30.工厂模式 想象一下一家餐馆,它实际上是一家食品工厂。 如果你需要 dosa <sup class="footnote">[ [64](#_footnotedef_64 "View footnote.") ]</sup> ,请问服务员,如果你需要 idiyappam <sup class="footnote">[ [65](#_footnotedef_65 "View footnote.") ]</sup> ,请问服务员 它。 本质上,饭店或食品工厂创建了一个称为服务员的通用界面,供你订购任何东西。 你只问他,他就送了,你不必关心 dosa 的制作方式或 idiyappam 的制作方式。 在编程中,你可以做同样的事情,你可以实现一个工厂类,该类隐藏了制造对象的困难,并为你提供了一个通用的接口来制造对象。 看下面的代码 [factory.rb](code/design_patterns/factory.rb) 。 输入并运行它。 ```rb ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ```rb | ``` # factory.rb class Shape def draw puts "In instance of #{self.class}" end end class Square < Shape end class Circle < Shape end class ShapeFactory def get_shape type case type when :square then Square.new when :circle then Circle.new end end end shape_factory = ShapeFactory.new square = shape_factory.get_shape :square circle = shape_factory.get_shape :circle square.draw circle.draw ```rb | ``` 输出: ```rb In instance of Square In instance of Circle ``` 让我们看看它是如何工作的。 代码中的重点是这一点 ```rb class ShapeFactory def get_shape type case type when :square then Square.new when :circle then Circle.new end end end ``` 我们有一个名为`ShapeFactory`的类,该类提供了通过函数`get_shape`制作对象的通用接口。 我们将要创建的对象类型传递给此`get_shape`。 由于这只是示例,此处的工厂模式看起来像是使代码复杂而不是程序员更简单,但是在现实生活中,对象的创建可能非常复杂,如果工厂类可以掩盖复杂性,那么它的生命就可以了。 程序员使用它来构建他的软件将变得简单。 ### 30.1。 行使 想象一下,你正在编写用于游戏的软件,并且需要创建敌对对象,例如坦克,直升机,导弹发射器,步兵等。 编写一个工厂模式,当你调用`Enemy.random`时会返回一个随机的敌人对象。