设计模式---工厂模式

在设计模式中,工厂模式可以大致分为三类:简单工厂模式工厂方法模式抽象工厂模式

 

1.简单工厂模式

1.1定义

简单工厂模式是由一个工厂对象根据收到的消息决定要创建哪一个类的对象实例。

 

1.2例子

/**
 * 形状接口,定义draw()方法
 */
public interface Shape {

    void draw();

}

 

/**
 * 圆形
 */
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("This is Circle: draw()...");
    }
}

 

/**
 * 矩形
 */
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("This is Rectangle: draw()...");
    }
}

 

/**
 * 正方形
 */
public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("This is Square: draw()...");
    }
}

 

/**
 * 简单工厂类
 */
public class ShapeFactory {

    public static Shape getShape(String shapeType) {
        if ("circle".equalsIgnoreCase(shapeType)) {
            return new Circle();
        } else if ("rectangle".equalsIgnoreCase(shapeType)) {
            return new Rectangle();
        } else if ("square".equalsIgnoreCase(shapeType)) {
            return new Square();
        }

        return null;
    }

}

 

public class SimpleFactoryDemo {

    public static void main(String[] args) {
        Shape circle = ShapeFactory.getShape("circle");
        circle.draw();
        Shape rectangle = ShapeFactory.getShape("rectangle");
        rectangle.draw();
        Shape square = ShapeFactory.getShape("square");
        square.draw();
    }

}

 

2.工厂方法模式

2.1定义

提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。

 

2.2例子

/**
 * 工厂接口
 */
public interface ShapeFactory {

    Shape getShape();

}

 

/**
 * 圆形工厂类
 */
public class CircleFactory implements ShapeFactory {
    @Override
    public Shape getShape() {
        return new Circle();
    }
}

 

/**
 * 矩形工厂类
 */
public class RectangleFactory implements ShapeFactory {
    @Override
    public Shape getShape() {
        return new Rectangle();
    }
}

 

/**
 * 正方形工厂类
 */
public class SquareFactory implements ShapeFactory {
    @Override
    public Shape getShape() {
        return new Square();
    }
}

 

public class MethodFactoryDemo {

    public static void main(String[] args) {
        ShapeFactory circleFactory = new CircleFactory();
        Shape circle = circleFactory.getShape();
        circle.draw();

        ShapeFactory rectangleFactory = new RectangleFactory();
        Shape rectangle = rectangleFactory.getShape();
        rectangle.draw();

        ShapeFactory squareFactory = new SquareFactory();
        Shape square = squareFactory.getShape();
        square.draw();
    }

}

工厂方法模式与简单工厂模式的区别在于,工厂方法模式定义了一个工厂接口,所有的工厂类(子类)都继承此接口,程序需要指明具体工厂类并且创建来获取产品对象。

 

3.抽象工厂模式

3.1定义

抽象工厂是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

 

3.2例子

添加颜色接口

/**
 * 颜色接口
 */
public interface Color {

    void fill();

}

 

/**
 * 红色
 */
public class Red implements Color {
    @Override
    public void fill() {
        System.out.println("This is Red: fill()...");
    }
}

 

/**
 * 绿色
 */
public class Green implements Color {
    @Override
    public void fill() {
        System.out.println("This is Green: fill()...");
    }
}

 

/**
 * 蓝色
 */
public class Blue implements Color {
    @Override
    public void fill() {
        System.out.println("This is Blue: fill()...");
    }
}

 

/**
 * 抽象工厂类
 */
public abstract class AbstractFactory {

    public abstract Color getColor(String colorType);
    public abstract Shape getShape(String shapeType) ;

}

 

/**
 * 形状工厂类
 */
public class ShapeFactory extends AbstractFactory {
    @Override
    public Color getColor(String colorType) {
        return null;
    }

    @Override
    public Shape getShape(String shapeType) {
        if ("circle".equalsIgnoreCase(shapeType)) {
            return new Circle();
        } else if ("rectangle".equalsIgnoreCase(shapeType)) {
            return new Rectangle();
        } else if ("square".equalsIgnoreCase(shapeType)) {
            return new Square();
        }

        return null;
    }
}

 

/**
 * 颜色工厂类
 */
public class ColorFactory extends AbstractFactory {
    @Override
    public Color getColor(String colorType) {
        if ("red".equalsIgnoreCase(colorType)) {
            return new Red();
        } else if ("green".equalsIgnoreCase(colorType)) {
            return new Green();
        } else if ("blue".equalsIgnoreCase(colorType)) {
            return new Blue();
        }

        return null;
    }

    @Override
    public Shape getShape(String shapeType) {
        return null;
    }
}

 

/**
 * 工厂创造器,用于获取特定工厂类
 */
public class FactoryProducer {

    public static AbstractFactory getFactory(String factoryType) {
        if ("shape".equalsIgnoreCase(factoryType)) {
            return new ShapeFactory();
        } else if ("color".equalsIgnoreCase(factoryType)) {
            return new ColorFactory();
        }

        return null;
    }

}

 

public class AbstractFactoryDemo {

    public static void main(String[] args) {
        AbstractFactory shapeFactory = FactoryProducer.getFactory("shape");
        Shape circle = shapeFactory.getShape("circle");
        circle.draw();

        AbstractFactory colorFactory = FactoryProducer.getFactory("color");
        Color red = colorFactory.getColor("red");
        red.fill();

    }

}

抽象工厂模式和工厂方法模式相似,只不过抽象工厂更加强调父类工厂(超级工厂),通过父类工厂来获取特定子类工厂,再得到产品对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值