GoF23 工厂模式学习笔记

GoF23 工厂模式学习笔记

工厂模式核心本质:

 1. 实例化对象不使用new,用工厂方法代替
 2. 将选择实现类,创建对象统一管理和控制,从而将调用者和实现类解耦
三种模式:

 1. 简单工厂模式:用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改原有代码)
 2. 工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
 
 根据设计原则选择:工厂方法模式
 根据实际业务选择:简单工厂模式(实际上这个用得更多)

 3. 抽象工厂模式:围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂
 
 抽象工厂模式优点:
 1. 具体产品在应用层进行隔离,无需关心创建细节
 2. 将一系列产品统一到一起创建
 抽象工厂模式缺点:
 抽象工厂在稳定的情况下非常强大,但假设需要频繁扩展产品,所有类都必须做出相应修改
简单工厂模式
package factory.simple;

public interface Car {
	void name();
}

package factory.simple;

public class Ford implements Car{

	@Override
	public void name() {
		System.out.println("Ford");
	}

}

package factory.simple;

public class Tesla implements Car{

	@Override
	public void name() {
		System.out.println("Tesla");
	}

}

package factory.simple;

public class CarFactory {
	public static Car getCar(String name) {
		// 假设要扩展新的产品,此处代码需要被修改
		switch (name) {
		case "Tesla":
			return new Tesla();
		case "Ford":
			return new Ford();
		default:
			return null;
		}
	}
}

package factory.simple;

public class Consumer {

	public static void main(String[] args) {
		Car tesla = CarFactory.getCar("Tesla");
		Car ford = CarFactory.getCar("Ford");
		
		tesla.name();
		ford.name();
	}

}

工厂方法模式
package factory.method;

public interface Car {
	void name();
}

package factory.method;

public interface CarFactory {
	Car getCar();
}

package factory.method;

public class Ford implements Car{

	@Override
	public void name() {
		System.out.println("Ford");
	}

}

package factory.method;

public class FordCarFactory implements CarFactory{

	@Override
	public Car getCar() {
		// TODO Auto-generated method stub
		return new Ford();
	}

}

package factory.method;

public class Tesla implements Car{

	@Override
	public void name() {
		System.out.println("Tesla");
	}

}

package factory.method;

public class TeslaCarFactory implements CarFactory{

	@Override
	public Car getCar() {
		// TODO Auto-generated method stub
		return new Tesla();
	}

}

package factory.method;

public class Consumer {

	public static void main(String[] args) {
		Car ford = new FordCarFactory().getCar();
		Car tesla = new TeslaCarFactory().getCar();
		ford.name();
		tesla.name();
	}

}
	很明显工厂方法模式容易扩展但其代码量很大。
抽象工厂模式
package factory_abstract;

public interface PhoneProduct {
	void call();
}

package factory_abstract;

public class HuaWeiPhone implements PhoneProduct {

	@Override
	public void call() {
		System.out.println("call with HuaWeiPhone");
	}

}

package factory_abstract;

public class MiPhone implements PhoneProduct{

	@Override
	public void call() {
		System.out.println("call with MiPhone");
	}

}

package factory_abstract;

public interface RouterProduct {
	void wifi();
}

package factory_abstract;

public class HuaWeiRouter implements RouterProduct{

	@Override
	public void wifi() {
		System.out.println("use wifi with HuaWeiRouter");
	}

}

package factory_abstract;

public class MiRouter implements RouterProduct{

	@Override
	public void wifi() {
		System.out.println("use wifi with MiRouter");
	}

}

package factory_abstract;

public interface ProductFactory {
	
	PhoneProduct phoneProduct();
	
	RouterProduct routerProduct();
	
}

package factory_abstract;

public class HuaWeiFactory implements ProductFactory{

	@Override
	public PhoneProduct phoneProduct() {
		// TODO Auto-generated method stub
		return new HuaWeiPhone();
	}

	@Override
	public RouterProduct routerProduct() {
		// TODO Auto-generated method stub
		return new HuaWeiRouter();
	}

}

package factory_abstract;

public class MiFactory implements ProductFactory{

	@Override
	public PhoneProduct phoneProduct() {
		// TODO Auto-generated method stub
		return new MiPhone();
	}

	@Override
	public RouterProduct routerProduct() {
		// TODO Auto-generated method stub
		return new MiRouter();
	}

}

package factory_abstract;

public class Consumer {

	public static void main(String[] args) {
		HuaWeiFactory huaWeiFactory = new HuaWeiFactory();
		PhoneProduct huaWeiPhone = huaWeiFactory.phoneProduct();
		RouterProduct huaWeiRouter = huaWeiFactory.routerProduct();
		huaWeiPhone.call();
		huaWeiRouter.wifi();
		
		MiFactory miFactory = new MiFactory();
		PhoneProduct miPhone = miFactory.phoneProduct();
		RouterProduct miRouter = miFactory.routerProduct();
		miPhone.call();
		miRouter.wifi();
	}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值