Home > Backend Development > PHP Tutorial > PHP design pattern - abstract factory pattern, design pattern factory_PHP tutorial

PHP design pattern - abstract factory pattern, design pattern factory_PHP tutorial

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-07-13 10:19:16
Original
1075 people have browsed it

php design pattern - abstract factory pattern, design pattern factory

Before studying this chapter, please read the simple factory pattern and factory method pattern

Under what circumstances should the abstract factory pattern be used:
1. A system should not depend on the details of how product class instances are created, combined and expressed. This The factory pattern is important for all forms.
2. The products of this system have more than one product family, and the system only consumes products from one of the families.
3. Products belonging to the same product family are used together, and this constraint must be reflected in the system design.
4. The system provides a product class library, and all products appear with the same interface, so that the client does not depend on the implementation.


Case 1:
Let’s take the farm as an example.
Our farm is divided into multiple product lines, one of which specializes in selling vegetables and fruits from the north. One specializes in selling southern vegetables and fruits. You can try not to write it. I won’t give an example here. You can try to draw the UML class diagram.


Case 2:
Take a computer as an example
Computers are divided into PC computers and mac computers. PC computers have the CPU, motherboard, and keyboard required for assembly | Mac computers also need these components, but the models are different. The following is the UML class diagram of this example.

Code example:

This example is based on Nuwa’s creation of human beings.

<span>  1</span> <?<span>php
</span><span>  2</span> 
<span>  3</span> <span>//</span><span>此实例是根据女娲造人写的
</span><span>  4</span> 
<span>  5</span> <span>//首先定义一个全局的工厂接口
</span><span>  6</span> <span>//由阴绳 阳绳来继承 都要实现举绳子这个方法</span>
<span>  7</span> <span>interface</span><span> nvwaRope{
</span><span>  8</span>     <span>public</span> <span>function</span> liftPeopleRope(<span>$name</span><span>);
</span><span>  9</span>     <span>public</span> <span>function</span> liftAnimalRope(<span>$name</span><span>);
</span><span> 10</span> <span>}
</span><span> 11</span> 
<span> 12</span> <span>//</span><span>定义阴绳 来继承 nvwaRope</span>
<span> 13</span> <span>class</span> yinRope <span>implements</span><span> nvwaRope{
</span><span> 14</span>     <span>public</span> <span>function</span> liftPeopleRope(<span>$name</span><span>){
</span><span> 15</span>         <span>return</span> <span>new</span> girl(<span>$name</span><span>);
</span><span> 16</span> <span>    }
</span><span> 17</span> 
<span> 18</span>     <span>public</span> <span>function</span> liftAnimalRope(<span>$name</span><span>){
</span><span> 19</span>         <span>return</span> <span>new</span> muAnimal(<span>$name</span><span>);
</span><span> 20</span> <span>    }
</span><span> 21</span> <span>}
</span><span> 22</span> 
<span> 23</span> <span>//</span><span>定义阳绳 </span>
<span> 24</span> <span>class</span> yangRope <span>implements</span><span> nvwaRope{
</span><span> 25</span>     <span>public</span> <span>function</span> liftPeopleRope(<span>$name</span><span>){
</span><span> 26</span>         <span>return</span> <span>new</span> boy(<span>$name</span><span>);
</span><span> 27</span> <span>    }
</span><span> 28</span> 
<span> 29</span>     <span>public</span> <span>function</span> liftAnimalRope(<span>$name</span><span>){
</span><span> 30</span>         <span>return</span> <span>new</span> gongAnimal(<span>$name</span><span>);
</span><span> 31</span> <span>    }
</span><span> 32</span> <span>}
</span><span> 33</span> 
<span> 34</span> 
<span> 35</span> <span>//</span><span>定义一个人的抽象接口</span>
<span> 36</span> <span>interface</span><span> people{
</span><span> 37</span>     <span>public</span> <span>function</span><span> eat();
</span><span> 38</span>     <span>public</span> <span>function</span><span> getName();
</span><span> 39</span> <span>}
</span><span> 40</span> 
<span> 41</span> 
<span> 42</span> <span>abstract</span> <span>class</span> abstractPeople <span>implements</span><span> people{
</span><span> 43</span>     <span>private</span> <span>$name</span><span>;
</span><span> 44</span> 
<span> 45</span>     <span>public</span> <span>function</span> __construct(<span>$name</span><span>){
</span><span> 46</span>         <span>$this</span>->name = <span>$name</span><span>;
</span><span> 47</span> <span>    }
</span><span> 48</span> 
<span> 49</span>     <span>public</span> <span>function</span><span> eat(){
</span><span> 50</span>         <span>echo</span> <span>$this</span>->name . " eat"<span>;
</span><span> 51</span> <span>    }
</span><span> 52</span> 
<span> 53</span>     <span>public</span> <span>function</span><span> getName(){
</span><span> 54</span>         <span>echo</span> <span>$this</span>-><span>name;
</span><span> 55</span>         <span>return</span> <span>$this</span>-><span>name;
</span><span> 56</span> <span>    }
</span><span> 57</span> 
<span> 58</span>     <span>//</span><span>检查是否有胸</span>
<span> 59</span>     <span>public</span> <span>function</span><span> checkChest(){
</span><span> 60</span>         <span>return</span> <span>$this</span>-><span>haveChest;
</span><span> 61</span> <span>    }
</span><span> 62</span> <span>}
</span><span> 63</span> 
<span> 64</span> <span>class</span> boy <span>extends</span><span> abstractPeople{
</span><span> 65</span>     <span>public</span> <span>$haveChest</span> = <span>false</span>; <span>//</span><span>男孩没有胸</span>
<span> 66</span> <span>}
</span><span> 67</span> 
<span> 68</span> <span>class</span> girl <span>extends</span><span> abstractPeople{
</span><span> 69</span>     <span>public</span> <span>$haveChest</span> = <span>true</span>; <span>//</span><span>女孩有胸</span>
<span> 70</span> <span>}
</span><span> 71</span> 
<span> 72</span> 
<span> 73</span> <span>//</span><span>定义一个动物的抽象接口</span>
<span> 74</span> <span>interface</span><span> animal{
</span><span> 75</span>     <span>public</span> <span>function</span><span> eat();
</span><span> 76</span>     <span>public</span> <span>function</span> <span>sleep</span><span>();
</span><span> 77</span> <span>}
</span><span> 78</span> 
<span> 79</span> <span>abstract</span> <span>class</span> abstractAnimal <span>implements</span><span> animal{
</span><span> 80</span>     <span>private</span> <span>$name</span><span>;
</span><span> 81</span> 
<span> 82</span>     <span>public</span> <span>function</span> __construct(<span>$name</span><span>){
</span><span> 83</span>         <span>$this</span>->name = <span>$name</span><span>;
</span><span> 84</span> <span>    }
</span><span> 85</span> 
<span> 86</span>     <span>public</span> <span>function</span><span> eat(){
</span><span> 87</span>         <span>echo</span> <span>$this</span>->name . " eating"<span>;
</span><span> 88</span> <span>    }
</span><span> 89</span> 
<span> 90</span>     <span>public</span> <span>function</span> <span>sleep</span><span>(){
</span><span> 91</span>         <span>echo</span> <span>$this</span>->name . " sleeping"<span>;
</span><span> 92</span> <span>    }
</span><span> 93</span> 
<span> 94</span>     <span>public</span> <span>function</span><span> getName(){
</span><span> 95</span>         <span>echo</span> <span>$this</span>-><span>name;
</span><span> 96</span>         <span>return</span> <span>$this</span>-><span>name;
</span><span> 97</span> <span>    }
</span><span> 98</span> <span>}
</span><span> 99</span> 
<span>100</span> <span>//</span><span>定义一个母动物的类</span>
<span>101</span> <span>class</span> muAnimal <span>extends</span><span> abstractAnimal{
</span><span>102</span>     <span>public</span> <span>$xingbie</span> = "mu"<span>;
</span><span>103</span> <span>}
</span><span>104</span> 
<span>105</span> 
<span>106</span> <span>//</span><span>定义一个公动物的类</span>
<span>107</span> <span>class</span> gongAnimal <span>extends</span><span> abstractAnimal{
</span><span>108</span>     <span>public</span> <span>$xingbie</span> = "gong"<span>;
</span><span>109</span> <span>}
</span><span>110</span> 
<span>111</span> 
<span>112</span> 
<span>113</span> <span>//</span><span>使用方式
</span><span>114</span> 
<span>115</span> <span>//首先获取工厂的实例 也就是阴绳或者阳绳的实例</span>
<span>116</span> <span>$yinRope</span> = <span>new</span><span> yinRope();
</span><span>117</span> 
<span>118</span> <span>$people</span> = <span>$yinRope</span>->liftPeopleRope("zhangsan"<span>);
</span><span>119</span> <span>echo</span> <span>$people</span>-><span>eat();
</span><span>120</span> <span>echo</span> <span>$people</span>-><span>getName();
</span><span>121</span> <span>var_dump</span>(<span>$people</span>-><span>checkChest());
</span><span>122</span> 
<span>123</span> <span>$animel</span> = <span>$yinRope</span>->liftAnimalRope("马"<span>);
</span><span>124</span> <span>echo</span> <span>$animel</span>->eat();
Copy after login

What are the benefits of PHP design patterns

If you use UserFactory, you don’t need to know the existence of the User class. The abstract class will help you hide it. If there are more classes in the future, this pattern will be more convenient to maintain. It is recommended that you learn about the abstract factory pattern, factory pattern, and factory. Method patterns, these are all means for reusable programming.

The difference between factory method pattern and abstract factory pattern

Factory method pattern:
An abstract product class can derive multiple specific product classes.
An abstract factory class can derive multiple concrete factory classes.
Each concrete factory class can only create one instance of a concrete product class.

Abstract factory pattern:
Multiple abstract product classes, each abstract product class can derive multiple specific product classes.
An abstract factory class can derive multiple concrete factory classes.
Each concrete factory class can create multiple instances of concrete product classes.

Difference:
The factory method pattern has only one abstract product class, while the abstract factory pattern has multiple.
The concrete factory class of the factory method pattern can only create one instance of the specific product class, while the abstract factory pattern can create multiple instances.

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/876331.htmlTechArticlephp design pattern - abstract factory pattern, design pattern factory. Before studying this chapter, please read the simple factory pattern and factory Under what circumstances should the abstract factory model be used in the method pattern...
Related labels:
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template