简单工厂、工厂方法、抽象工厂的区别

7 篇文章 2 订阅
3 篇文章 0 订阅

1. 简单工厂/静态工厂

定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法

优点:简单易于实现,把类的实例化交给工厂,易于解耦。
缺点:违反了OCP开闭原则。
案例:JDK日期格式化DateFormat,JDK密钥生成器KeyGenerator

public class Factory{
	public static Phone creator(String type){
		Phone phone = null;
        if(type.equalsIgnoreCase("hauwei")){
		    phone = new HuaweiPhone();
		}else if(type.equalsIgnoreCase("xiaomi")){
		     phone = new XiaomiPhone();
		}
		return phone;
	}
	
	public static void main(String[] args) {
		Phone xiaomiPhone = Factory.creator("xiaomi");
	}
}

2. 工厂方法

在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构

优点:将具体创建工作交给子类去做,可以允许系统在不修改工厂角色的情况下引进新产品
缺点:添加新产品时,要写新的产品类,还要提供对应的具体工厂类,系统中类的个数将成对增加
案例:JDBC工厂、log日志记录器

interface Factory {  
	Phone produce();
}
public class HuaweiPhoneFactory implements Factory{
	Phone produce(){ /* 生产华为手机 */}
}
public class XiaomiPhoneFactory implements Factory{
	Phone produce(){ /* 生产小米手机*/ }
}
public class Test{
	public static void main(String[] args) {
		Factory huaweiFactory = new HuaweiPhoneFactory;
		Factory xiaomiFactory = new xiaomiPhoneFactory;
		Phone huaweiPhone = huaweiFactory.produce();
		Phone xiaomiPhone = xiaomiFactory.produce();
	}
}

3. 抽象工厂

抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品

优点:隔离了具体类的生成,可以实现高内聚低耦合的设计目的,符合“开闭原则”
缺点:开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)

public abstract class AbstractFactory{
	public abstract AbstractProductA createProductA(); 
	public abstract AbstractProductB createProductB();
}
public class ConcreteFactory1 extends AbstractFactory {
	public AbstractProductA createProductA() {
    	return new ConcreteProductA1();
	}
	public AbstractProductB createProductB() {
	    return new ConcreteProductB1();
	}
}
public class ConcreteFactory2 extends AbstractFactory {
	public AbstractProductA createProductA() {
    	return new ConcreteProductA2();
	}
	public AbstractProductB createProductB() {
	    return new ConcreteProductB2();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值