今天来谈谈GOF二十三种设计模式之一的工厂模式,工厂模式是一种创建型模式,使用工厂模式可以使得用户快速获取对象,达到复用代码、简化开发的作用。同时工厂模式是遵循开闭原则的
一、静态工厂
静态工厂又叫简单工厂,犹如其名是最简单的工厂模式。创建一个工厂类,该类负责实现复杂的创建对象的逻辑,用户提供一个标识参数即可拿到这个对象。
静态工厂不属于GOF二十三种设计模式
public class CourseFactory {
public ICourse createCourse(Class<? extends ICourse> clazz) {
try {
if (clazz == null) {
return null;
}
return clazz.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
public interface ICourse {
void createCourse();
}
public class JavaCourse implements ICourse{
@Override
public void createCourse() {
System.out.println("java course");
}
}
客户端代码:
public class Test {
public static void main(String[] args) {
CourseFactory factory = new CourseFactory();
ICourse course = factory.createCourse(PythonCourse.class);
course.createCourse();
}
}
如例子所示,假如我们需要拿到Python课程对象,我们只需要传入对应的Class对象,且这个参数只能是实现了ICourse接口的才可以,提高代码的健壮性
二、工厂方法
当我们需要创建很多重复对象时,我们可以使用工厂方法模式。
工厂方法其实就是工厂的工厂,同样是获取课程,我们有一个顶级工厂,然后具体的课程工程实现这个顶级工厂,我们需要Java课程就从这个Java factory里面获取,需要Python课程就从Python factory里获取。工厂方法也满足了单一职责原则
其缺点就是项目会出现大量的类。
上代码
public interface ICourse {
void createCourse();
}
public class JavaCourse implements ICourse{
@Override
public void createCourse() {
System.out.println("Java course");
}
}
public interface IFactory {
ICourse createCourse();
}
public class JavaCourseFactory implements IFactory {
@Override
public ICourse createCourse() {
return new JavaCourse();
}
}
三、抽象工厂
抽象工厂较为复杂,它不是具体产品的工厂,而是抽象产品的工厂。
为了方便理解抽象工厂模式提出了 等级结构和产品族的概念
等级结构可以理解为同一个厂家不同的产品,而这些产品组成了一个产品族。
抽象工厂实际上就是定义了一个顶级的抽象工厂类,里面提供了所有的创建产品族的方法。即一个厂家要生产哪些产品是事先知道的。
然后各个厂家的工厂分别继承/实现该顶级工厂
海尔公司可以生产洗衣机,格力厂家也可以生产洗衣机,只是其等级结构不同。
先看下抽象工厂的类图
顶级抽象工厂定义为家电类,方法为创建洗衣机和电冰箱。然后国美工厂和美的工厂继承这个抽象类
然后定义洗衣机和电冰箱接口,国美牌洗衣机和美的牌洗衣机都实现这个接口。
客户想创建美的洗衣机,不需要关心复杂的内在关系,只需要拿到美的工厂类就可以创建美的牌下所有的类。
缺点:
抽象工厂的缺点就是后期如果我们有新产品假如导致之前所有接口都要修改,违背的开闭原则。
以上全是个人理解手打,理解有误可以积极指出。
下一期是对GOF二十三种设计模式的单例模式进行深度剖析(奥利给^_^)