Android技术知识Android开发经验谈设计模式

工厂方法模式及策略模式

2018-09-09  本文已影响9人  某昆

本文主要内容

本文继续介绍相关设计模式,本期介绍工厂方法模式、抽象工厂模式以及策略模式。工厂方法较为常见,策略模式非常有意思,本人最先做的一个app重构用的就是策略模式,印象深刻

1、工厂方法介绍

工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪个类

工厂方法UML图

其实工厂方法模式,在工作中胜利太多了,很多某某Factory的相关类,都是这种设计模式。在任何需要生成复杂对象的地方,都可以使用工厂方法模式。需要注意的是,它和抽象工厂模式的差别。

2、工厂模式

工厂方法模式比较简单,直接上代码:

public abstract class Product {
    public abstract void method();
}

public class ProductA extends Product{

  @Override
  public void method() {
      System.out.println("i am a");
  }

}

public class ProductB extends Product{

    @Override
    public void method() {
        System.out.println("i am B");
    }

}

public abstract class Factory {

  public abstract <T extends Product> T create(Class<T> clz);
}

public class ConcreateFactory extends Factory{

@Override
public <T extends Product> T create(Class<T> clz) {
    Product p = null;
    try {
        p = (Product) Class.forName(clz.getName()).newInstance();
    } catch (Exception e) {
    }
    return (T) p;
}

public static void main(String[] args) {
    Factory factory = new ConcreateFactory();
    Product p = factory.create(ProductB.class);
    p.method();
    p = factory.create(ProductA.class);
    p.method();
    
}

}

3、抽象工厂定义

抽象工厂:为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类。

光从定义看,貌似与工厂方法没什么差别。它们定义之间的差别,只有个别词语的差别。工厂方法是创建对象,而抽象工厂是创建一组相关或者相互依赖的对象,由此可见,如果是创建继承同一父类或者实现同一接口的对象,可用工厂方法,如果是创建不同的对象(对象之间有关联),则用抽象工厂

抽象工厂UML图

由UML图可见,抽象工厂不止有多个产品,还有多个工厂

4、抽象工厂

我们以生产Q3和Q7两种车型为例,介绍抽象工厂。

public abstract class CarFactory {

  public abstract ITire createTire();
  public abstract IEngine createEngine();
}

public interface ITire {
  void tire();
}

public class SuvTire implements ITire{

  @Override
  public void tire() {
      System.out.println("我是越野轮胎");
  }
}

public class NormalTire implements ITire {

  @Override
  public void tire() {
      System.out.println("我是普通轮胎");
  }
}

public interface IEngine {
  void engine();
}

public class NormalEngine implements IEngine{

  @Override
  public void engine() {
      System.out.println("我是普通引擎");
  }
}

public class ImportEngine implements IEngine{

  @Override
  public void engine() {
      System.out.println("我是进口引擎");
  }
}


public class Q3Factory extends CarFactory{

@Override
public ITire createTire() {
    return new NormalTire();
}

@Override
public IEngine createEngine() {
    return new NormalEngine();
}
}


public class Q7Factory extends CarFactory{

@Override
public ITire createTire() {
    return new SuvTire();
}

@Override
public IEngine createEngine() {
    return new ImportEngine();
}

}


public class Client {

public static void main(String[] args) {
    CarFactory q3 = new Q3Factory();
    q3.createEngine().engine();
    q3.createTire().tire();
    System.out.println("-------------");
    CarFactory q7 = new Q7Factory();
    q7.createEngine().engine();
    q7.createTire().tire();
}
}

5、策略模式

策略模式:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

设计模式学到这,才算是有点意思,前面写的各种模式貌似非常简单,策略模式其实也很简单。就是将不同的实现封装在不同的子类中,以注入方式实现替换不同实现。如果在代码中看到很多if else或者switch,可以考虑使用策略模式重构。

我们常说代码的可扩展性,什么叫可扩展性,就是添加新功能更加容易。比如现在我们有一个音乐app,app有两个乐库来源,一个是虾米音乐,另一个是酷我音乐,此时我们应该怎么做呢?如果我们事先定义了一个音乐源的超类,然后分别以子类形式实现引入虾米和酷我,是不是就完成了这个功能。这就叫做可扩展性,因为你不确定以后还会不会接入其它音乐源。并且修改其中一个类不会影响另一个类,这个叫健壮性。重构代码中两个非常重要的特性,可扩展和健壮性都能在策略械中得到淋漓尽致的体现!

策略模式UML图

关于策略模式相关的代码,本文不再贴了,其实非常简单,上文以音乐app为例,基本已经说明此问题了。

上一篇下一篇

猜你喜欢

热点阅读