工厂方法 模式 【转】
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 }
浙公网安备 33010602011771号