简单工厂模式(不在23种设计模式中)

简单工厂模式一般分为:普通简单工厂、多方法简单工厂、静态方法简单工厂

一、 普通简单工厂

  • 例子:以工厂生产华为手机和苹果手机为例,类图如下:
    在这里插入图片描述

  • 类图主要角色
    抽象产品(Abstract Product):为具体实现提供公共接口
    具体产品(Concrete Product):实现抽象类的公共接口
    工厂(Factory):提供创建实体对象的方法

  • 代码实现如下

抽象产品

/**
 * 手机
 */
public interface Phone {
    // 打电话
    void call();
}

具体产品

/**
 * 华为手机
 */
public class HuaweiPhone implements Phone {
    @Override
    public void call() {
        System.out.println("用华为手机打电话...");
    }
}
/**
 * 苹果手机
 */
public class ApplePhone implements Phone {
    @Override
    public void call() {
        System.out.println("用苹果手机打电话...");
    }
}

工厂

/**
 * 工厂
 */
public class Factory {
    public static String HUAWEI = "华为手机";
    public static String APPLE = "苹果手机";

    public Phone produce(String phoneType) {
        if (HUAWEI.equals(phoneType)) {
            System.out.println("新华为手机");
            return new HuaweiPhone();
        } else if (APPLE.equals(phoneType)) {
            System.out.println("新苹果手机");
            return new ApplePhone();
        } else {
            System.out.println("请输入正确的手机类型!");
            return null;
        }
    }
}

测试

public class Test {
    public static void main(String[] args) {
        Factory factory = new Factory();
        Phone huaweiPhone = factory.produce(Factory.HUAWEI);
        huaweiPhone.call();
        Phone applePhone = factory.produce(Factory.APPLE);
        applePhone.call();
    }
}
// 运行结果
新华为手机
用华为手机打电话...
新苹果手机
用苹果手机打电话...

二、多方法简单工厂

  • 将上面的工厂(Factory)类修改
/**
 * 工厂
 */
public class Factory {
    public Phone produceHuaweiPhone() {
        System.out.println("新华为手机");
        return new HuaweiPhone();
    }
    public Phone produceApplePhone() {
        System.out.println("新苹果手机");
        return new ApplePhone();
    }
}

测试

public class Test {
    public static void main(String[] args) {
        Factory factory = new Factory();
        Phone huaweiPhone = factory.produceHuaweiPhone();
        huaweiPhone.call();
        Phone applePhone = factory.produceApplePhone();
        applePhone.call();
    }
}
// 运行结果
新华为手机
用华为手机打电话...
新苹果手机
用苹果手机打电话...

三、静态方法简单工厂
将上面的工厂(Factory )类修改下就行

/**
 * 工厂
 */
public class Factory {
    public static Phone produceHuaweiPhone() {
        System.out.println("新华为手机");
        return new HuaweiPhone();
    }
    public static Phone produceApplePhone() {
        System.out.println("新苹果手机");
        return new ApplePhone();
    }
}

测试

public class Test {
    public static void main(String[] args) {
        Phone huaweiPhone= Factory.produceHuaweiPhone();
        huaweiPhone.call();
        Phone applePhone= Factory.produceApplePhone();
        applePhone.call();
    }
}
// 运行结果
新华为手机
用华为手机打电话...
新苹果手机
用苹果手机打电话...

总结:普通简单工厂如果传入的字符串有误,不能正确创建对象,静态工厂方法模式和多方法简单工厂相比不需要实例化工厂类。所以,大多数情况下,我们会选用静态工厂方法模式

  • 简单工厂模式有一个问题就是,类的创建依赖工厂类,如果要拓展程序,必须对工厂类进行修改,这违背了开闭原则,所以工厂方法模式可以替换简单工厂模式
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值