近期的疫情数据终于赢来了拐点,新增人数也终于降到了3位数,全国各地也视当地情况开始陆续的复工,相信未来会越来越好。PS:终于可以出门撒欢儿了。
今天我们来了解下设计模式的6大原则之一的里氏代换原则。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
工厂模式(Factory Pattern)是Java中最常用的设计模式之一。它属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象的。
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
下面用一个例子了解下工厂模式的简单写法:
1、第一步创建一个Animal接口,里面有个表示动物叫声的抽象方法。
public interface Animal {
void barking();
}
2、第二步去创建具体对象,实现该接口和抽象方法。
public class Dog implements Animal {
@Override
public void barking() {
Log.d("animal", "狗是'汪汪'叫的");
}
}
3、创建一个工厂类和获取对象的方法,并通过该方法的传参来区分需要new出的对象。
public class AnimalFactory {
public static Animal getAnimal(String name){
if (name.equals("Dog")){
return new Dog();
}
if (name.equals("Cat")){
return new Cat();
}
if (name.equals("Chicken")){
return new Chicken();
}
return null;
}
}
4、使用该工厂类创建对象,也就是具体的使用它。
Animal dog = AnimalFactory.getAnimal("Dog");
dog.barking();
工厂模式在Android中的使用也很常见,比如我们常用的方法getSystemService方法就是一种简单的工厂模式。
WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
通常都是通过getSystemService方法获取一个具体的android系统服务对象,比如这里就是获取WindowManager对象。
@Override
public Object getSystemService(@ServiceName @NonNull String name) {
if (getBaseContext() == null) {
throw new IllegalStateException(
"System services not available to Activities before onCreate()");
}
if (WINDOW_SERVICE.equals(name)) {
return mWindowManager;
} else if (SEARCH_SERVICE.equals(name)) {
ensureSearchManager();
return mSearchManager;
}
return super.getSystemService(name);
}
这个虽然mWindowManager不是在此方法中被创建,但也是通过这种同一个方法根据参数名区分来得到不同的对象的引用,因此也能算是一种简单的工厂模式。
Android中还有一种常用的Factory,就是BitmapFactory。BitmapFactory就是通过工厂类中不同的方法不同的参数构造出我们所需要的各种各样的Bitmap。
public class BitmapFactory {
......
public static Bitmap decodeResource(Resources res, int id, Options opts) {
Bitmap bm = null;
......
return bm;
}
......
public static Bitmap decodeFile(String pathName, Options opts) {
Bitmap bm = null;
......
return bm;
}
......
}