设计模式-工厂模式

133 阅读2分钟

工厂设计模式定义

定义一个创建对象的接口,让子类决定实例化哪个类,而对象的创建统一交由工厂去生成,既做到了解耦也保证了最少知识原则。一般分为三类:简单工厂模式,工厂方法模式,抽象工厂模式

举例

提供两种存储方式让子类决定采用哪种方式存储。

简单工厂模式:直接在工厂中根据传来的类型动态实例化类 创建对象的接口:

public interface IOHandler {

  void save(String key,String value);
  void save(String key,int value);
  String getString(String key,String defalutValue);
  int getInt(String key,String defalutValue);

}

对象实现接口:

public class PreferenceIoHandler  implements IOHandler{
  @Override
  public void save(String key, String value) {

  }

  @Override
  public void save(String key, int value) {

  }

  @Override
  public String getString(String key, String defalutValue) {
      return null;
  }

  @Override
  public int getInt(String key, String defalutValue) {
      return 0;
  }
}


public class MemoyIOhander implements IOHandler {

  //存在内存里面,其实就是一个Map集合
  private static LruCache<String,Object> mCache= new LruCache<>(1024*1024);
  @Override
  public void save(String key, String value) {

  }

  @Override
  public void save(String key, int value) {

  }

  @Override
  public String getString(String key, String defalutValue) {
      return null;
  }

  @Override
  public int getInt(String key, String defalutValue) {
      return 0;
  }
}

对象的创建统一交给工厂去完成

public class IOFactory implements Factory{
  // 通过 Factory 去创建 IOHandler 对象
  public static IOHandler createIOHandler(IOType type){
      switch (type){
          case IOType.MEMORY:
              // 内存缓存
              return new MemoryIOHandler();
          case IOType.PREFERENCES:
              // Preferences缓存
              return new PreferencesIOHandler();
          case IOType.DISK:
              // 磁盘缓存
              return new DiskIOHandler();
          default:
              return null;
      }
  }
}

客户端决定去实现哪个类:

public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      // 获取磁盘缓存的 IOHandler 
      IOHandler ioHandler = IOFactory.createIOHandler(IOFactory.IOType.DISK);
      // 保存数据
      ioHandler.save("userName","darren");
      ioHandler.save("userPwd","940223");
  }

**工厂方法:一个工厂类实现一种存储方式的实列类** 一个工厂一般生产相对应的产品 创建对象的接口: ``` public interface IOHandler {
void save(String key,String value);
void save(String key,int value);
String getString(String key,String defalutValue);
int getInt(String key,String defalutValue);

}

对象实现接口:

public class PreferenceIoHandler implements IOHandler{ @Override public void save(String key, String value) {

}

@Override
public void save(String key, int value) {

}

@Override
public String getString(String key, String defalutValue) {
    return null;
}

@Override
public int getInt(String key, String defalutValue) {
    return 0;
}

}

public class MemoyIOhander implements IOHandler {

//存在内存里面,其实就是一个Map集合
private static LruCache<String,Object> mCache= new LruCache<>(1024*1024);
@Override
public void save(String key, String value) {

}

@Override
public void save(String key, int value) {

}

@Override
public String getString(String key, String defalutValue) {
    return null;
}

@Override
public int getInt(String key, String defalutValue) {
    return 0;
}

}

对象的创建统一交给工厂去完成

public interface IOFactory {

IOHandler createIOhandler();

}

public class MemoryIOFactory implements IOFactory { @Override public IOHandler createIOhandler() { return new MemoyIOhander(); } }

public class PerferenceIOFactory implements IOFactory { @Override public IOHandler createIOhandler() { return new PreferenceIoHandler(); } }

客户端决定去实现哪个类:

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取磁盘缓存的 IOHandler IOFactory ioFactory = new MemoryIOFactory(); IOHandler ioHandler= ioFactory.createIOhandler();

    // 保存数据
    ioHandler.save("userName","darren");
    ioHandler.save("userPwd","940223");
}

}

<br/>
**抽象工厂:在一个工厂中,实现不同的方法实列化不同的对象**
定义跟 BItmapFactory 比较像,也跟简单工厂模式比较像,通过特定的方法返回单一的对象

创建对象的接口:

public interface IOHandler {

void save(String key,String value);
void save(String key,int value);
String getString(String key,String defalutValue);
int getInt(String key,String defalutValue);

}

对象实现接口:

public class PreferenceIoHandler implements IOHandler{ @Override public void save(String key, String value) {

}

@Override
public void save(String key, int value) {

}

@Override
public String getString(String key, String defalutValue) {
    return null;
}

@Override
public int getInt(String key, String defalutValue) {
    return 0;
}

}

public class MemoyIOhander implements IOHandler {

//存在内存里面,其实就是一个Map集合
private static LruCache<String,Object> mCache= new LruCache<>(1024*1024);
@Override
public void save(String key, String value) {

}

@Override
public void save(String key, int value) {

}

@Override
public String getString(String key, String defalutValue) {
    return null;
}

@Override
public int getInt(String key, String defalutValue) {
    return 0;
}

}

对象的创建统一交给工厂去完成

public class IOHandlerFactory {

public static IOHandler createIohandler(Class<? extends IOHandler> IiohanflerClass){

    IOHandler ioHandler = null;
    try {
        ioHandler= IiohanflerClass.newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return ioHandler;

}


public static IOHandler getMemoryIOHandler(){
    return createIohandler(MemoyIOhander.class);
}

public static IOHandler getPreferenceIOHandler(){
    return createIohandler(PreferenceIoHandler.class);
}

}

客户端决定去实现哪个类:

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取磁盘缓存的 IOHandler IOHandler ioHandler = IOHandlerFactory.getMemoryIOHandler();

    // 保存数据
    ioHandler.save("userName","darren");
    ioHandler.save("userPwd","940223");
}

}


#### 使用场景:
使用的对象有共性,并且在以后存在多样性。并且我们的创建的对象的过程不想让别人知道并比较复杂。数据库创建(Factory),地图的选择(百度,高德,google),加载图片类型的选择(ImageLoader,Glide,Picasso),源码(BitmapFactory,XmlPullParserFactory)