美文网首页Android设计模式
Android设计模式-4.2-工厂方法模式

Android设计模式-4.2-工厂方法模式

作者: 今阳说 | 来源:发表于2018-06-03 20:24 被阅读66次

1. 定义:

  • 又称工厂模式、多态工厂模式和虚拟构造器模式
  • 此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂,具体工厂,抽象产品,具体产品;
  • 简单工厂的弊端:
    1.工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响
    2.违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂
    3.简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构
    • 工厂方法模式如何解决了上述问题:
      • 工厂方法模式把具体产品的创建推迟到工厂类的子类(具体工厂)中,
      • 此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口

2. 适用场景

  • 对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
  • 只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。

3. 实例演示

同样以宠物店买猫为例

  1. 创建抽象猫类
abstract class Cat {
    public abstract void show();
}
  1. 创建两个猫咪子类
class CatA extends Cat {

        @Override
        public void show() {
            LjyLogUtil.i("A-波斯猫:喵喵喵!!!");
        }
    }

 class CatB extends Cat {

        @Override
        public void show() {
            LjyLogUtil.i("B-虎斑猫:喵喵喵~~~");
        }
    }

前面这两步和简单工厂模式是一样的,工厂方法模式相对于简单工厂模式的最大优点就在于工厂类的可扩展性

  1. 创建抽象工厂类
abstract class CatFactory {
    public abstract Cat newCat();
 }
  1. 创建两个具体工厂类
class CatAFactory extends CatFactory {

        @Override
        public Cat newCat() {
            return new CatA();
        }
    }

    class CatBFactory extends CatFactory {

        @Override
        public Cat newCat() {
            return new CatB();
        }
    }
  1. 具体使用
 private void methodFactoryMethod() {

        CatAFactory catAFactory = new CatAFactory();
        catAFactory.newCat().show();

        CatBFactory catBFactory = new CatBFactory();
        catBFactory.newCat().show();

    }
  1. 也可以像下面这样用反射创建工厂类(需要知道要创建的具体实现类,耦合度高)
public class CatFactory {
        public <T extends Cat> T getCat(Class<T> c) {
            Cat cat = null;
            try {
                cat = (Cat) Class.forName(c.getName()).newInstance();
                //java.lang.InstantiationException: java.lang.Class  xxxx has no zero argument constructor
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            LjyLogUtil.i("cat:" + cat);
            return (T) cat;
        }
    }

相关文章

网友评论

    本文标题:Android设计模式-4.2-工厂方法模式

    本文链接:https://www.haomeiwen.com/subject/vscssftx.html