工厂模式【创建型】

本文介绍了三种常见的工厂模式:简单工厂模式、工厂方法模式和抽象工厂模式。通过实例展示了它们在Java中的应用,并分析了各自优缺点。简单工厂模式通过静态方法创建对象,适合简单场景但不满足开闭原则。工厂方法模式引入了抽象工厂,允许子类决定实例化哪个产品类,更符合开闭原则。抽象工厂模式则进一步扩展,提供了一组创建相关或相互依赖对象的接口,避免了显式的耦合。
摘要由CSDN通过智能技术生成

目录

1. 简单工厂模式

1.1 举例

1.2 自定义实现一个简单工厂模式

1.3 优点

1.4 缺点

2.工厂方法模式

2.1 举例

2.2 自定义代码

3.抽象工厂模式


1. 简单工厂模式

又称为静态工厂方法模式,它属于类创建型模式。在简单工厂模式下,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有相同的父类。

1.1 举例

jdk中的工具类DateFormat,根据参数的不同创建不同类的实例。

private static DateFormat get(LocaleProviderAdapter adapter, int timeStyle, int dateStyle, Locale loc) {
	DateFormatProvider provider = adapter.getDateFormatProvider();
	DateFormat dateFormat;
	if (timeStyle == -1) {
		dateFormat = provider.getDateInstance(dateStyle, loc);
	} else {
		if (dateStyle == -1) {
			dateFormat = provider.getTimeInstance(timeStyle, loc);
		} else {
			dateFormat = provider.getDateTimeInstance(dateStyle, timeStyle, loc);
		}
	}
	return dateFormat;
}

1.2 自定义实现一个简单工厂模式

public class SimpleFactory {
    public static Product createProduct(String type){
        if ("A".equals(type)){
            return new A();
        }else if("B".equals(type)){
            return new B();
        }else {
            return null;
        }
    }

    public static void main(String[] args) {
        Product a = SimpleFactory.createProduct("A");
        a.produce();
    }

}
abstract class Product{
    public abstract void produce();
}
class A extends Product{
    @Override
    public void produce() {
        System.out.println("产品A被生产");
    }
}
class B extends Product{
    @Override
    public void produce() {
        System.out.println("产品B被生产");
    }
}

1.3 优点

将对象的创建和使用分开,对象的创建交给工厂类,我们只需要去考虑如何使用。

1.4 缺点

违反了开闭原则【软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的】。当新增一个产品时需要修改原来的代码逻辑,不能灵活拓展。

2.工厂方法模式

2.1 举例

jdk中的集合类,如Collection为抽象工厂,LinkedList、ArrayList为具体的工厂,Iterator为抽象产品,ListItr、Itr为具体产品,它们分别由LinkedList、ArrayList生产。

2.2 自定义代码

对比上面类图来看,Collection相当于Factory;LinkedList、ArrayList相当于HuaWeiFatory、XiaoMiFactory;Iterator相当于Phone;ListItr、Itr相当于HuaWeiPhone、XiaoMiPhone。

public class FactoryMethod {
    public static void main(String[] args) {
        HuaWeiPhoneFactory huaWeiFactory = new HuaWeiPhoneFactory();
        Phone phone = huaWeiFactory.createPhone();
        phone.produce();
    }
}

//公共的产品接口
interface Phone{
    void produce();
};

//具体的产品华为手机
class HuaWeiPhone implements Phone{
    @Override
    public void produce() {
        System.out.println("生产华为手机。");
    }
};
//具体的产品小米手机
class XiaoMiPhone implements Phone{
    @Override
    public void produce() {
        System.out.println("生产小米手机。");
    }
};

interface PhoneFactory{
    Phone createPhone();
};

class HuaWeiPhoneFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {
        return new HuaWeiPhone();
    }
};

class XiaoMiPhoneFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {
        return new XiaoMiPhone();
    }
};

3.抽象工厂模式

在使用工厂方法模式创建一个产品的例子中,不管我们创建的HuaWeiPhone、XiaoMiPhone,它们都属于一个大类:Phone类。此处就体现除了工厂方法的局限性,假如这个工厂还要生产computer呢?又得重新弄一个工厂吗?其实抽象工厂模式就是工厂模式的一个拓展。如下示意图:

抽象工厂模式打破了工厂模式中工厂与产品大类的一对一的关系。一个工厂可以生产多个大类的产品。如湖南工厂既可以生产手机还可以生产电脑。

设计模式只是一种指导思想,我们应当根据实际的情况来选择合适的模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值