01简单工厂模式

定义

  • 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式
  • 在简单工厂模式中,可以根据参数的不同返回不同类的实例
  • 简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类

结构

在这里插入图片描述

分析

  1. 将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易
  2. 在调用工厂类的工厂方法时,由于工厂方法是静态方法,使用起来很方便,可通过工厂类类名直接调用,只需要传入一个简单的参数即可,无须知道对象的创建细节
  3. 可以将参数保存在XML等格式的配置文件中,修改时无须修改任何Java源代码
  4. 问题:工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则

优点

  1. 实现了对象创建和使用的分离
  2. 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可
  3. 可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性

缺点

  1. 工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响
  2. 增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度
  3. 系统扩展困难,一旦添加新产品不得不修改工厂逻辑
  4. 由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构,工厂类不能得到很好地扩展

示例代码

package hw1.q1;

public interface Shape {
    void draw();
    void erase();
}
package hw1.q1;

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("这是Circle的draw方法");
    }

    @Override
    public void erase() {
        System.out.println("这是Circle的erase方法");
    }
}
package hw1.q1;

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("这是Rectangle的draw方法");
    }

    @Override
    public void erase() {
        System.out.println("这是Rectangle的erase方法");
    }
}
package hw1.q1;

public class Triangle implements Shape {

    @Override
    public void draw() {
        System.out.println("这是Triangle的draw方法");
    }

    @Override
    public void erase() {
        System.out.println("这是Triangle的erase方法");
    }
}
package hw1.q1;

public class SimpleFactory {

    public Shape createShape(String type) throws unsupportedShapeException {

        if(type.equalsIgnoreCase("circle")) {
            System.out.println("工厂正在生产圆形...");
            return new Circle();
        } else if(type.equalsIgnoreCase("rectangle")) {
            System.out.println("工厂正在生产矩形...");
            return new Rectangle();
        } else if(type.equalsIgnoreCase("triangle")) {
            System.out.println("工厂正在生产三角形...");
            return new Triangle();
        } else {
            throw new unsupportedShapeException();
        }
    }

    static class unsupportedShapeException extends Exception {
    }
}

package hw1.q1;

public class Client {

    public static void main(String[] args) {
        SimpleFactory sf = new SimpleFactory();
        Circle circle = null;
        Rectangle rectangle = null;
        Triangle triangle =null;

        try {
            circle = (Circle) sf.createShape("circle");
            circle.draw();
            circle.erase();
            rectangle = (Rectangle) sf.createShape("rectangle");
            rectangle.draw();
            rectangle.erase();

            triangle = (Triangle) sf.createShape("triangle");
            triangle.draw();
            triangle.erase();

        } catch (SimpleFactory.unsupportedShapeException e) {
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值