设计模式——工厂模式

简单工厂模式

简介

简单工厂模式:根据参数的不同,返回不同类的实例。返回的实例通常具有相同的父类(一般是接口)。

优点

  • 工厂类中包含了逻辑判断,只需要根据客户端的条件生成相关对象。

缺点

  • 每次增加产品类都需要修改工厂类中的相关逻辑。没有遵循“开放—封闭”原则。

示例代码

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();
    }
}

小结

  • 简单工厂模式、工厂方法模式、抽象工厂模式都属于创建型模式。
  • 工厂方法模式中弥补了简单工厂模式的不足——不遵循“开放-封闭“原则。
  • 抽象工厂模式中弥补了工厂模式的不足——一个工厂只能生产一种产品。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值