如创建Bitmap对象的时候,例如通过资源id获取Bitmap对象:
Bitmap bitmap=BitmapFactory.decodeResource(
getResources(), R.drawable.ic_launcher);
以宠物店买猫为例
abstract class Cat {
public abstract void show();
}
class CatA extends Cat {
@Override
public void show() {
LjyLogUtil.i("A-波斯猫:喵喵喵~");
}
}
class CatB extends Cat {
@Override
public void show() {
LjyLogUtil.i("B-虎斑猫:喵喵喵~~~");
}
}
class CatFactory {
public enum CatType {
TYPE_A,
TYPE_B
}
public static Cat newCat(CatType catType) {
switch (catType) {
case TYPE_A:
return new CatA();
case TYPE_B:
return new CatB();
default:
return null;
}
}
}
private void methodSimpleFactoryPattern() {
CatFactory.newCat(CatFactory.CatType.TYPE_A).show();
CatFactory.newCat(CatFactory.CatType.TYPE_B).show();
// try {
// CatFactory.newCat(2).show();
// } catch (NullPointerException e) {
// LjyLogUtil.i("没有这一类Cat");
// }
}
又称工厂模式、多态工厂模式和虚拟构造器模式;
此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂,具体工厂,抽象产品,具体产品;
简单工厂的弊端: 1.工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响; 2.违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂; 3.简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构; 工厂方法模式如何解决上述问题:
工厂方法模式把具体产品的创建推迟到工厂类的子类(具体工厂)中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口;
对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程对于使用者来说是透明的。
如常用的Retrofit中的Converter.Factory ,CallAdapter.Factory即为抽象工厂类,它们的子类即为具体工厂类:
private RetrofitUtil() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BaseUrl.getBaseUrl())
//配置okhttp
.client(getOkHttpClient())
//支持gson
.addConverterFactory(GsonConverterFactory.create())
//增加返回值为Oservable的支持,RxJava
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
apiService = retrofit.create(ApiService.class);
}
以宠物店买鸭子为例
abstract class Duck {
public abstract void show();
}
class DuckA extends Duck {
@Override
public void show() {
LjyLogUtil.i("DuckA:呀呀呀~");
}
}
class DuckB extends Duck {
@Override
public void show() {
LjyLogUtil.i("DuckB:呀呀呀~");
}
}
前面这两步和简单工厂模式是一样的,工厂方法模式相对于简单工厂模式的最大优点就在于工厂类的可扩展性
abstract class DuckFactory {
public abstract Duck newDuck();
}
class DuckAFactory extends DuckFactory {
@Override
public Duck newDuck() {
return new DuckA();
}
}
class DuckBFactory extends DuckFactory {
@Override
public Duck newDuck() {
return new DuckB();
}
}
private void methodFactoryMethod() {
DuckAFactory duckAFactory = new DuckAFactory();
duckAFactory.newDuck().show();
DuckBFactory duckBFactory = new DuckBFactory();
duckBFactory.newDuck().show();
}
class DuckFactort {
public T get(Class duckClass) {
try {
Duck duck = (Duck) Class.forName(duckClass.getName()).newInstance();
return (T) duck;
} catch (Exception e) {
return null;
}
}
}