设计模式——工厂模式(简单工厂,工厂方法,抽象工厂)

本文深入解析简单工厂、工厂方法和抽象工厂三种设计模式。通过代码示例详细解释了每种模式的特点、应用场景及其实现方式。从简单工厂模式的快速产品实例化到抽象工厂模式的复杂产品族创建,全面覆盖了工厂模式的应用范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单工厂模式
用来生产同一等级结构中的任意产品(对于增加新的产品需要覆盖已有代码)

实例化对象不用new,用工厂方法代替。
将调用者跟实现类解耦。
(虽然不符合开闭设计原则,但实际使用的多)

package factory_simple;

public interface Car {
	public abstract void  getCar();
}
package factory_simple;

public class WuLing implements Car {

	@Override
	public void getCar() {
		// TODO Auto-generated method stub
		System.out.println("wuling");
	}

}
package factory_simple;

public class Tesla implements Car {

	@Override
	public void getCar() {
		// TODO Auto-generated method stub
		System.out.println("tesila");
	}

}
package factory_simple;

public class CarFactory {
	public static Car getCar(String car) {
		if(car.contentEquals("wuling")) {
			return new WuLing();
		}else if(car.contentEquals("tesila")) {
			return new Tesla();
		}else {
			return null;
		}
	}
}
package factory_simple;

public class Consumer {

	public static void main(String[] args) {
		Car c1=new WuLing();//用new实例化对象
		c1.getCar();
		//实例化对象不用new,用工厂方法代替,将调用者跟实现类解耦
		Car c2=CarFactory.getCar("tesila");
		c2.getCar();
	}

}
结果:
wuling
tesila

在这里插入图片描述
工厂方法模式
用来生产同一等级结构中的任意产品(支持增加任意产品)

满足设计原则,但是不方便

package factory_method;

public interface Car {
	public abstract void  getCar();
}
package factory_method;

public interface CarFactory {
	public abstract Car getCarname();
}
package factory_method;

public class Tesla implements Car {

	@Override
	public void getCar() {
		// TODO Auto-generated method stub
		System.out.println("tesila");
	}

}
package factory_method;

public class TeslaFactory implements CarFactory {

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

}
package factory_method;

public class WuLing implements Car {

	@Override
	public void getCar() {
		// TODO Auto-generated method stub
		System.out.println("wuling");
	}

}
package factory_method;

public class WuLingFactory implements CarFactory {

	@Override
	public Car getCarname() {
		return new WuLing();
	}

}
package factory_method;

public class Consumer {

	public static void main(String[] args) {
		
		Car c=new WuLingFactory().getCarname();
		c.getCar();
	}

}
结果:
wuling

在这里插入图片描述
抽象工厂
围绕一个超级工厂,创建其他工厂。该超级工厂又称为其他工厂的工厂。
(不可以增加产品,可以增加产品族)
提供了创建一系列相关或者相互依赖对象的接口,无需指定它们的具体类。

相关概念:
(1)产品族:如:小米工厂生产的,小米手机和小米路由器属于同一个产品族。
(2)产品等级:如:小米工厂生产的小米手机和华为工厂生产的华为手机,都是手机属于同一产品等级。
在这里插入图片描述

package abstract_factory;

public interface IphoneProduct {
	void open();
	void shutDown();
	void message();
}

package abstract_factory;

public interface IRoundProduct {
	void open();
	void shutDown();
	void openWIFI();
}

package abstract_factory;

public class XiaomiPhone implements IphoneProduct {

	@Override
	public void open() {
		// TODO Auto-generated method stub
		System.out.println("小米手机开机");
	}

	@Override
	public void shutDown() {
		// TODO Auto-generated method stub
		System.out.println("小米手机关机");

	}

	@Override
	public void message() {
		// TODO Auto-generated method stub
		System.out.println("小米手机发短信");

	}

}
package abstract_factory;

public class XiaomiRound implements IRoundProduct {

	@Override
	public void open() {
		// TODO Auto-generated method stub
		System.out.println("小米路由器开机");
	}

	@Override
	public void shutDown() {
		// TODO Auto-generated method stub
		System.out.println("小米路由器关机");

	}

	@Override
	public void openWIFI() {
		// TODO Auto-generated method stub
		System.out.println("小米路由器开wifi");

	}

}
package abstract_factory;

public class HuaweiPhone implements IphoneProduct {

	@Override
	public void open() {
		// TODO Auto-generated method stub
		System.out.println("华为手机开机");
	}

	@Override
	public void shutDown() {
		// TODO Auto-generated method stub
		System.out.println("华为手机关机");

	}

	@Override
	public void message() {
		// TODO Auto-generated method stub
		System.out.println("华为手机发短信");

	}

}

package abstract_factory;

public class HuaweiRound implements IRoundProduct {

	@Override
	public void open() {
		// TODO Auto-generated method stub
		System.out.println("华为路由器开机");
	}

	@Override
	public void shutDown() {
		// TODO Auto-generated method stub
		System.out.println("华为路由器关机");

	}

	@Override
	public void openWIFI() {
		// TODO Auto-generated method stub
		System.out.println("华为路由器开wifi");

	}

}
package abstract_factory;

public interface IProductFactory {
	IphoneProduct iphoneProduct();
	IRoundProduct iRoundProduct();
}

package abstract_factory;

public class XiaomiFactory implements IProductFactory {

	@Override
	public IphoneProduct iphoneProduct() {
		// TODO Auto-generated method stub
		return new XiaomiPhone();
	}

	@Override
	public IRoundProduct iRoundProduct() {
		// TODO Auto-generated method stub
		return new XiaomiRound();
	}

}

package abstract_factory;

public class HuaweiFactory implements IProductFactory {

	@Override
	public IphoneProduct iphoneProduct() {
		// TODO Auto-generated method stub
		return new HuaweiPhone();
	}

	@Override
	public IRoundProduct iRoundProduct() {
		// TODO Auto-generated method stub
		return new HuaweiRound();
	}

}

package abstract_factory;

public class Client {

	public static void main(String[] args) {
		XiaomiFactory  xiaomiFactory=new XiaomiFactory();//工厂创建对象
		IphoneProduct iphoneProduct=xiaomiFactory.iphoneProduct();//产品创建对象
		iphoneProduct.message();//对象实现具体方法
		HuaweiFactory huaweiFactory=new HuaweiFactory();
		IRoundProduct iRoundProduct=huaweiFactory.iRoundProduct();
		iRoundProduct.openWIFI();
	}

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值