代码改变世界

工厂方法 模式 【转】

2019-08-15 21:19  tonyniu8  阅读(90)  评论(0)    收藏  举报

原文链接:https://blog.csdn.net/qq_29676623/article/details/85795036

 

定义:定义一个创建对象接口,但是让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。解决同一产品等级的业务抽象问题。

简单工厂模式如果产品太多,那么工厂类的逻辑判断也会很多,如果再加上创建对象时的一些判断逻辑,那该工厂类的代码会显得很臃肿。用工厂方法模式可以起到拆分的效果,即同一产品等级下利用产品对应的工厂实例创建各自的产品实例。

类型:创建型。

适用场景:

创建对象需要大量重复的代码,可以考虑工厂方法是不是适用在这里。
客户端(应用层)不依赖于产品类实例如何被创建、实现等细节。
一个类通过其子类来指定创建哪个对象。
优点:

用户只需要关心所需产品对应的工厂,无需关心创建细节
加入新产品符合开闭原则,提高可扩展性
缺点:

类的个数容易过多,增加复杂度(增加新的类的时候,就需要同时添加该类对应的工厂类)
增加了系统的抽象性和理解难度

 1 public class Circle implements Shape {
 2      
 3        @Override
 4        public void draw() {
 5           System.out.println("Inside Circle::draw() method.");
 6        }
 7     }
 8 
 9 public class Rectangle implements Shape {
10      
11        @Override
12        public void draw() {
13           System.out.println("Inside Rectangle::draw() method.");
14        }
15     }
16 
17 public class Square implements Shape {
18 
19     @Override
20     public void draw() {
21         System.out.println("Inside Square::draw() method.");
22     }
23 }
24 
25 public abstract class ShapeFactory {
26 
27     public abstract Shape getShape();
28 
29 }
30 
31 public class CircleFactory extends ShapeFactory {
32 
33     @Override
34     public Shape getShape() {
35         return new Circle();
36     }
37 }
38 
39 class RectangleFactory extends ShapeFactory {
40 
41     @Override
42     public Shape getShape() {
43         return new Rectangle();
44     }
45 }
46 
47 class SquareFactory extends ShapeFactory {
48 
49     @Override
50     public Shape getShape() {
51         return new Square();
52     }
53 }
54 
55 
56 public class FactoryPatternDemo {
57 
58     public static void main(String[] args) {
59         // 获取 Circle 的对象,并调用它的 draw 方法
60         ShapeFactory shapeFactory = new CircleFactory();
61         Shape shape1 = shapeFactory.getShape();
62         shape1.draw();
63 
64         // 获取 Rectangle 的对象
65         ShapeFactory shapeFactory1 = new RectangleFactory();
66         Shape shape2 = shapeFactory1.getShape();
67         shape2.draw();
68         
69         // 获取Square 的对象
70         ShapeFactory shapeFactory2 = new SquareFactory();
71         Shape shape3 = shapeFactory2.getShape();
72         shape3.draw();
73 
74     }
75 }

Collection#iterator 方法,Iterator 就是产品, Collection<E> 抽象工厂,产品实例就是 ArrayList 里面的一个内部类 Itr 实现了 Iterator 接口,而 ArrayList 本身可以看做  Collection 工厂的子类工厂实例。每个继承 Collection 接口的子类都有不同的实现得到不同的产品实例。

 1 public interface Collection<E> extends Iterable<E> {
 2 
 3 
 4   Iterator<E>iterator();
 5 }
 6 
 7 ....
 8 
 9 public class ArrayList<E> extends AbstractList<E>
10 implements List<E>, RandomAccess, Cloneable, java.io.Serializable
11 {
12 
13 
14   public Iterator<E> iterator() {
15         return new Itr();
16   }
17 
18 
19   private class Itr implements Iterator<E> {
20         int cursor;       // index of next element to return
21         int lastRet = -1; // index of last element returned; -1 if no such
22         int expectedModCount = modCount;
23 
24         Itr() {}
25 
26         public boolean hasNext() {
27             return cursor != size;
28         }
29     ...
30 
31 }