工厂模式
工厂模式
工厂模式是一种创造型模式,通过工厂模式,调用者直接通过工厂类即可获取对象,不需要通过new的方式,对象的实例化细节也因此不需要调用者关注。
常用的一下三种模式。
简单工厂模式
简答工厂模式也称作静态工厂模式。
用户只需要调用的工厂的静态即可获取对象。
UML图
代码
public class CarFactory {
public static Car getCar(String name) {
if ("Benz".equals(name)) {
return new BenzCar();
} else if ("Tesla".equals(name)) {
return new TeslaCar();
} else {
throw new UnsupportedOperationException();
}
}
}
工厂方法模式
为什么需要工厂方法模式
在简单工厂中,如果新增了一个产品,那么则需要在CarFactory中修改if-else的代码,这样违反了开闭原则(对扩展开放,对修改关闭),由此有了工厂方法模式。
工厂方法模式的核心是有一个工厂接口,所有的工厂都需要实现这个工厂接口,所以当我们新增一个产品,只需要写一个类实现产品接口,同时写一个类实现工厂接口。
UML图
代码
public class TeslaFactory implements Factroy {
@Override
public Car getCar() {
return new TeslaCar();
}
}
抽象工厂模式
为什么需要抽象工厂模式
在以上两种工厂模式中,只存在一种产品。
抽象工厂模式的着眼点是一系列的产品。
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
产品结构和产品族
同一类产品,比如小米手机和华为手机就是属于同一个产品结构。
同一系列的产品,比如小米手机和小米路由器,华为手机和华为路由器就是属于同一个产品族。
UML图
代码
public interface SuperFactory {
Phone getPhone();
Router getRouter();
}
public class HuaWeiFactory implements SuperFactory {
@Override
public Phone getPhone() {
return new HuaWeiPhone();
}
@Override
public Router getRouter() {
return new HuaWeiRouter();
}
}