简单工厂模式
简介
简单工厂模式:根据参数的不同,返回不同类的实例。返回的实例通常具有相同的父类(一般是接口)。
优点
- 工厂类中包含了逻辑判断,只需要根据客户端的条件生成相关对象。
缺点
- 每次增加产品类都需要修改工厂类中的相关逻辑。没有遵循“开放—封闭”原则。
示例代码
public interface Shape {
void draw();
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Rectangle.draw()");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Square.draw()");
}
}
public class SimpleFactory {
public Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}else if ("Rectangle".equalsIgnoreCase(shapeType)) {
return new Rectangle();
}else if ("Square".equalsIgnoreCase(shapeType)) {
return new Square();
}else {
return null;
}
}
}
public class SimpleFactoryTest {
public static void main(String[] args) {
SimpleFactory factory = new SimpleFactory();
Shape shape = factory.getShape("square");
shape.draw();
}
}
工厂方法模式
简介
工厂方法模式:将创建对象的工作交给了对应的工厂子类。定义一个创建对象的工厂接口,但是该接口创建什么对象,需要由子类来决定。每个产品(对象)都有对应的工厂。
优点
- 简单工厂模式的进一步抽象。
- 遵循了“开放—封闭”原则。
缺点
- 把逻辑判断转移到了客户端。
- 每个工厂只能产生一种产品。
- 每增加一种产品,就需要增加一个对应产品的工厂类。
示例代码
public interface Shape {
void draw();
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Square.draw()");
}
}
public interface Factory {
Shape getShape();
}
public class SquareFactory implements Factory{
@Override
public Shape getShape() {
return new Square();
}
}
public class FactoryTest {
public static void main(String[] args) {
Factory factory = new SquareFactory();
Shape shape = factory.getShape();
shape.draw();
}
}
抽象工厂模式
简介
抽象工厂模式:工厂方法模式中,一个工厂只能产生一种产品,而抽象工厂能产生多种产品。例如某品牌的电子产品工厂,不仅生产该品牌的手机,还有平板电脑,电视机等。
优点
- 遵循了“开放—封闭”原则。
- 可以生产一系列产品。
缺点
- 把逻辑判断转移到了客户端。
- 每增加一种产品,就需要增加一个对应产品的工厂类。
示例代码
public interface Color {
void fill();
}
public class Red implements Color {
@Override
public void fill() {
System.out.println("red.fill()...");
}
}
public interface Shape {
void draw();
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("rectangle.draw()...");
}
}
public abstract class AbstractFactory {
public abstract Shape getShape();
public abstract Color getColor();
}
public class RectangleAndRedFactory extends AbstractFactory {
@Override
public Shape getShape() {
return new Rectangle();
}
@Override
public Color getColor() {
return new Red();
}
}
public class Main {
public static void main(String[] args) {
AbstractFactory factory = new RectangleAndRedFactory();
Color color = factory.getColor();
Shape shape = factory.getShape();
color.fill();
shape.draw();
}
}
小结
- 简单工厂模式、工厂方法模式、抽象工厂模式都属于创建型模式。
- 工厂方法模式中弥补了简单工厂模式的不足——不遵循“开放-封闭“原则。
- 抽象工厂模式中弥补了工厂模式的不足——一个工厂只能生产一种产品。