工厂方法模式:
定义了一个创建对象的接口,由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
用 new 这个方法来创建对象,会造成耦合的问题,而这个问题可以通过工厂方法得以解决。
通常在设计一个类的过程中,在某个部分可能充斥的大量的实例化对象的地方,比如:
public class Store {
public Product createProduct(ProductEnum e) {
if(e == ProductEnum.a) { return new ProductA(); }
if(e == ProductEnum.b) { return new ProductB(); }
if(e == ProductEnum.c) { return new ProductC(); }
}
}
这个地方就是需要变化的地方,一旦需要改变,就要改变Store这个类的代码,但是如果可以把这部分抽取出来,放到一个专门的类中,那就相当于对Store进行了解耦。
需要说明的一点是: “ 简单工厂方法 ”是一种 “编程习惯”而不是一种 “设计模式”。
在使用工厂方法模式的时候,要注意两个概念:1.产品(包括:抽象的产品和具体实现的产品)。2.创建工厂(包括:抽象的工厂和具体实现的工厂)。
这两个概念应当是 “平行的类层级” 抽象的产品对应抽象的工厂,具体的产品对应具体的工厂。
设计原则:这个定义有一个名字叫“依赖倒置”
要依赖抽象,不要依赖具体类。
这个原则听起来很像是 “针对接口编程,不要针对实现编程” 但是在这个定义中,更加强调 抽象 的概念,这个定义说明:“不能让高层组件依赖于底层组件,而且,不管是高层组件还是底层组件,两者都应该依赖于抽象”。
抽象工厂模式:
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
定义了一个创建对象的接口,由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
用 new 这个方法来创建对象,会造成耦合的问题,而这个问题可以通过工厂方法得以解决。
通常在设计一个类的过程中,在某个部分可能充斥的大量的实例化对象的地方,比如:
public class Store {
public Product createProduct(ProductEnum e) {
if(e == ProductEnum.a) { return new ProductA(); }
if(e == ProductEnum.b) { return new ProductB(); }
if(e == ProductEnum.c) { return new ProductC(); }
}
}
这个地方就是需要变化的地方,一旦需要改变,就要改变Store这个类的代码,但是如果可以把这部分抽取出来,放到一个专门的类中,那就相当于对Store进行了解耦。
需要说明的一点是: “ 简单工厂方法 ”是一种 “编程习惯”而不是一种 “设计模式”。
在使用工厂方法模式的时候,要注意两个概念:1.产品(包括:抽象的产品和具体实现的产品)。2.创建工厂(包括:抽象的工厂和具体实现的工厂)。
这两个概念应当是 “平行的类层级” 抽象的产品对应抽象的工厂,具体的产品对应具体的工厂。
设计原则:这个定义有一个名字叫“依赖倒置”
要依赖抽象,不要依赖具体类。
这个原则听起来很像是 “针对接口编程,不要针对实现编程” 但是在这个定义中,更加强调 抽象 的概念,这个定义说明:“不能让高层组件依赖于底层组件,而且,不管是高层组件还是底层组件,两者都应该依赖于抽象”。
抽象工厂模式:
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。