工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂模式使一个类的实例化延迟到其子类。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
具体实例代码:https://gitee.com/binpowerbin/design_patterns.git
简单工厂
在工厂使用的时候,根据参数来确定创建的对象,入实例代码中的图形创建,菜鸟教程中的工厂模式举例也是简单工厂
部分代码展示
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
//获取 Circle 的对象,并调用它的 draw 方法
Shape shape1 = shapeFactory.getShape("CIRCLE");
//调用 Circle 的 draw 方法
shape1.draw();
//获取 Rectangle 的对象,并调用它的 draw 方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");
//调用 Rectangle 的 draw 方法
shape2.draw();
//获取 Square 的对象,并调用它的 draw 方法
Shape shape3 = shapeFactory.getShape("SQUARE");
//调用 Square 的 draw 方法
shape3.draw();
}
}
简单工厂的不足:每当我想添加一种新的产品,就必然要修改工厂类,这显然违反了开闭原则,亦不可取;所以简单工厂只适合于产品对象较少,且产品固定的需求,对于产品变化无常的需求来说显然不合适。
工厂方法
定义:将工厂提取成一个接口或抽象类,具体生产什么产品由子类决定;
角色:抽象产品类、具体产品类、抽象工厂类、具体工厂类。
使用说明:和简单工厂一样,产品类抽象出来,这次我们把工厂类也抽象出来,生产什么样的产品由子类来决定;
部分代码展示
public class ClientDemo {
public static void main(String[] args) {
//创建一个苹果工厂
FruitGardener fruitGardener = new AppleGardener();
Fruit apple = fruitGardener.factory();
apple.harvest();
//创建一个葡萄工厂
FruitGardener fruitGardener2 = new GrapeGardener();
Fruit grape = fruitGardener2.factory();
grape.harvest();
}
}
工厂方法模式的缺点:工厂方法和简单工厂相比,虽然实现了解耦,也遵循了开闭原则,但当产品非常多的时候,每次增加一个新产品,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
还有一个抽象工厂,放在下一篇专门记录。