创建型模式(工厂模式)

Posted 伍妖捌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建型模式(工厂模式)相关的知识,希望对你有一定的参考价值。

工厂模式

工厂模式实现了创建者调用者的分离

简单工厂模式(静态工厂模式)

在这里插入图片描述

作用:用来生产同一等级结构中的任意产品。

优点:实现简单

缺点:对于增加新的产品,需要覆盖已有代码

特点:在一个工厂中生产不同的产品

方法一

1.产品的接口类
创建一个形状接口,定义了一个形状方法;

public interface Shape {
    String shape();
}

创建产品类,比如圆,并且实现相应的方法

public class Circle implements Shape {
    @Override
    public String shape() {
        return "圆";
    }
}

创建产品类,比如矩形,并且实现相应的方法

public class Rectangle implements Shape {
    @Override
    public String shape() {
        return "矩形";
    }
}

2.创建工厂类

public class ShapeFactory {
    public static Shape draw(String type) {
        if ("circle".equals(type)) {
            return new Circle();
        } else if ("rectangle".equals(type)) {
            return new Rectangle();
        }
        return null;
    }
}

3.通过客户端调用

public class Client {
    public static void main(String[] args) {
        Shape circle = ShapeFactory.draw("circle");
        System.out.println(circle.shape());
        Shape rectangle = ShapeFactory.draw("rectangle");
        System.out.println(rectangle.shape());
    }
}

客户端使用的时候不需要自己创建对象,通过工厂获取对象

方法二

1.产品的接口类
创建一个形状接口,定义了一个形状方法;

public interface Shape {
    String shape();
}

创建产品类,比如圆,并且实现相应的方法

public class Circle implements Shape {
    @Override
    public String shape() {
        return "圆";
    }
}

创建产品类,比如矩形,并且实现相应的方法

public class Rectangle implements Shape {
    @Override
    public String shape() {
        return "矩形";
    }
}

2.创建工厂类

public class ShapeFactory {
    public static Shape getCircle() {
    	return new Circle();
	}

	public static Shape getRectangle() {
    	return new Rectangle();
	}
}

3.通过客户端调用

public class Client {
    public static void main(String[] args) {
        Shape circle = ShapeFactory.getCircle();
        System.out.println(circle.shape());
        Shape rectangle = ShapeFactory.getRectangle();
        System.out.println(rectangle.shape());
    }
}

客户端使用的时候不需要自己创建对象,通过工厂获取对象

工厂方法模式

在这里插入图片描述

作用:用来生产同一等级结构中的固定产品。

优点:支持增加任意产品

缺点:增加产品不需要修改原有代码,需要创建新的类,类会越来越多

特点:在一个工厂中生产相同的产品

实现

1.需要两个接口(一个是产品接口,一个是工厂接口)

public interface Shape {
    String shape();
}
public interface MethodFactory {
    Shape draw();
}

2.创建两个产品类,并实现产品接口

public class Circle implements Shape {
    @Override
    public String shape() {
        return "圆";
    }
}
public class Rectangle implements Shape {
    @Override
    public String shape() {
        return "矩形";
    }
}

3.创建两个工厂类

public class CircleFactory implements MethodFactory {
    @Override
    public Shape draw() {
        return new Circle();
    }
}
public class RectangleFactory implements MethodFactory {
    @Override
    public Shape draw() {
        return new Rectangle();
    }
}

4.客户端使用

public class Client {
    public static void main(String[] args) {
        MethodFactory circleFactory = new CircleFactory();
        Shape circle = circleFactory.draw();
        System.out.println(circle.shape());

        MethodFactory rectangleFactory = new RectangleFactory();
        Shape rectangle = rectangleFactory.draw();
        System.out.println(rectangle.shape());
    }
}

抽象工厂模式

在这里插入图片描述

作用:用来生产同一产品族中的固定产品

优点:在产品确定的情况下,比较稳定

缺点:不易增加新产品。

特点:在一个工厂中生产不同的产品,围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。

实现

1.创建两个产品接口
矩形接口

public interface Rectangle {
    String shape();
}

圆形接口

public interface Circle {
    String shape();
}

2.创建产品类

public class GreenCircle implements Circle{
    @Override
    public String shape() {
        return "绿色的圆";
    }
}
public class GreenRectangle implements Rectangle {
    @Override
    public String shape() {
        return "绿色的矩形";
    }
}
public class RedCircle implements Circle {
    @Override
    public String shape() {
        return "红色的圆";
    }
}
public class RedRectangle implements Rectangle {
    @Override
    public String shape() {
        return "红色的矩形";
    }
}

3.创建一个抽象的超级工厂

public interface AbstractFactory {
    Circle circle();

    Rectangle rectangle();
}

4.创建工厂

public class RedFactory implements AbstractFactory {
    @Override
    public Circle circle() {
        return new RedCircle();
    }

    @Override
    public Rectangle rectangle() {
        return new RedRectangle();
    }
}
public class GreenFactory implements AbstractFactory {
    @Override
    public Circle circle() {
        return new GreenCircle();
    }

    @Override
    public Rectangle rectangle() {
        return new GreenRectangle();
    }
}

5.在客户端中使用

public class Client {
    public static void main(String[] args) {
        GreenFactory greenFactory = new GreenFactory();
        Circle greenCircle = greenFactory.circle();
        Rectangle greenRectangle = greenFactory.rectangle();

        RedFactory redFactory = new RedFactory();
        Circle redCircle = redFactory.circle();
        Rectangle redRectangle = redFactory.rectangle();

        System.out.println(greenCircle.shape());
        System.out.println(greenRectangle.shape());

        System.out.println(redCircle.shape());
        System.out.println(redRectangle.shape());
    }
}

在这里插入图片描述

以上是关于创建型模式(工厂模式)的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 - 创建型模式_抽象工厂模式

设计模式 - 创建型模式_抽象工厂模式

设计模式 - 创建型模式_抽象工厂模式

设计模式 - 创建型模式_工厂方法模式

设计模式 - 创建型模式_工厂方法模式

设计模式 - 创建型模式_工厂方法模式