设计模式——简单工厂模式之女娲造人

本文详细讲解了简单工厂模式的定义,如何解决使用者隐藏具体类名的问题,并通过实例演示,包括女娲如何根据输入参数创造不同类型的人,如Man、Woman和Robot。代码实现和运行结果也一并展示。后续还展示了类图和代码的更新,以引入新的Robot类。
摘要由CSDN通过智能技术生成

目录

一、定义

二、解决的问题

三、模式结构图

四、具体实例(女娲造人)

4.1 UML类图

4.2 代码

4.3 运行结果


一、定义

        简单工厂模式又称为静态工厂方法模式,它属于类创建型模式。

        在简单工厂模式中,可以根据参数的不同返回不同类的实例,它专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

 

二、解决的问题

        使用者根据传入的参数即可返回所需的对象,而不需要知道具体类的类名。

        即使用者可直接消费产品而不需要知道其生产的细节。

 

三、模式结构图

        简单工厂模式包含如下角色:

        1、Factory(工厂角色)

        工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它返回一个抽象产品类Product,所有的具体产品都是抽象产品的子类。

        2、Product(抽象产品角色)

        抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。

        3、ConcreteProduct(具体产品角色)

        具体产品角色是简单工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法。

 

四、具体实例(女娲造人)

        题目:使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。

4.1 UML类图

增加Robot前的类图:

增加Robot后的类图:

 

4.2 代码

//抽象产品类:Person接口
public interface Person {
    void create();
}
//具体产品类:Man(男人)类
public class Man implements Person{
    public Man() {
    }

    @Override
    public void create() {
        System.out.println("造男人");
    }
}
//具体产品类:Woman(女人)类
public class Woman implements Person{
    public Woman() {
    }

    @Override
    public void create() {
        System.out.println("造女人");
    }
}
//具体产品类:Robot(机器人)类
public class Robot implements Person{
    public Robot() {
    }

    @Override
    public void create() {
        System.out.println("造机器人");
    }
}
//工厂类:Nvwa(女娲)类
public class Nvwa {
    public static Person getPerson(String person) throws Exception {
        if (person.equalsIgnoreCase("M")){
            return new Man();
        }else if (person.equalsIgnoreCase("W")){
            return new Woman();
        }else if (person.equalsIgnoreCase("R")){
            return new Robot();
        }else {
            throw new Exception("对不起,不能造该类人");
        }
    }
}
//测试类
public class Test {
    public static void main(String[] args) throws Exception {
        Scanner type = new Scanner(System.in);
        System.out.print("请输入参数: ");
        String s = type.nextLine();
        Person person = Nvwa.getPerson(s);
        person.create();
        type.close();
    }
}

 

         4.3 运行结果

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeTao-Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值