java实现工厂模式与抽象工厂模式

java—实现工厂模式与抽象工厂模式

1.工厂模式
问题:现有电脑产品windows和apple,请试用工厂模式描述该场景。

思路:

1. 根据描述,我们可以先创建两个产品类:Windows类和Apple类,然后定义一个产品接口,让这两个类实现接口方法表示类已经创建。

public interface Product {
	public void run();
}
public class Windows implements Product {
	@Override
	public void run() {
		System.out.println("product windows run!");
	}
}
public class Apple implements Product{
	@Override
	public void run() {
		System.out.println("product apple run!");
	}
}

2. 创建Test类,测试一下这两个方法

public class Test {
	public static void main(String[] args) {
		Windows windows = new Windows();
		windows.run();
		Apple apple = new Apple();
		apple.run();
	}
}

3. 工厂模式就是一个工厂生产一种产品,因此要定义一个WindowsFactory工厂类专门生产Windows类,定义一个AppleFactory工厂类专门生产Apple类,在此创建这两个工厂类之前,还需要定义一个抽象方法createProduct()让两个工厂实现。

public interface MyFactory {
	public Product createProduct();
}
public class WindowsFactory implements MyFactory{
	@Override
	public Product createProduct() {
		// TODO Auto-generated method stub
		return new Windows();
	}
}
public class AppleFactory implements MyFactory{
	@Override
	public Product createProduct() {
		// TODO Auto-generated method stub
		return new Apple();
	}
}

4. 回到Test类编写代码

public class Test {

	public static void main(String[] args) {
//		Windows windows = new Windows();
//		windows.run();
//		Apple apple = new Apple();
//		apple.run();
		WindowsFactory winFactory = new WindowsFactory();//创建Windows工厂
		Product windows = winFactory.createProduct();//工厂生产产品Windows
		windows.run();
		
		AppleFactory appleFactory = new AppleFactory();
		Product apple = appleFactory.createProduct();
		apple.run();
	}
}

2.抽象工厂模式
问题:现有电脑产品配件厂商基于windows和apple生产不同类型的CPU和RAM,请试用抽象工厂模式描述该场景。

问题分析:
Windows产品包含WindowsCPU和WindowsRAM,
Apple产品包含AppleCPU和AppleRAM,
或者说是CPU包含Windows型和Apple型,RAM包含Windows型和Apple型。

如果是工厂模式,则会创建四个工厂类,分别生产四个产品:WindowsCPU,AppleCPU,WindowsRAM,AppleRAM。

如果是抽象工厂模式,则只需要创建两个工厂类,将这四个产品两两组合(即一个工厂生产多种产品):
工厂1:WindowsCPU,WindowsRAM。工厂2:AppleCPU,AppleRAM
工厂1:WindowsCPU,AppleCPU。工厂2:WindowsRAM,AppleRAM
工厂1:WindowsCPU,AppleRAM。工厂2:AppleCPU,WindowsRAM

所以抽象工厂模式其实可以对应数学上的组合方式
x包含x1,x2,x3
y包含y1,y2,y3
任意抽出2个,C(6,2)=15种组合,你可以根据这15种组合选择判断创几个工厂比较合适。

思路:

1. 我选择创建两个接口CPU,RAM,分别创建WindowsCPU,WindowsRAM,AppleCPU,AppleRAM四个类来分别实现对应接口。

public interface CPU {
	public void CPURun();
}
public interface RAM {
	public void RAMRun();
}
public class WindowsCPU implements CPU{
	@Override
	public void CPURun() {
		System.out.println("windows cpu run!");
	}	
}
public class WindowsRAM implements RAM{
	public void RAMRun() {
		System.out.println("windows RAM run!");
	}
}
public class AppleCPU implements CPU{
	@Override
	public void CPURun() {
		System.out.println("apple CPU run!");
	}
}
public class AppleRAM implements RAM{
	@Override
	public void RAMRun() {
		System.out.println("apple RAM run!");
	}
}

2.创建Test类来运行一下

public class Test {
	public static void main(String[] args) {
		WindowsCPU  windowsCPU = new WindowsCPU();
		windowsCPU.CPURun();
		
		WindowsRAM windowsRAM = new WindowsRAM();
  	    windowsRAM.RAMRun();
  	    
		AppleCPU appleCPU = new AppleCPU();
		appleCPU.CPURun();
		
		AppleRAM appleRAM = new AppleRAM();
		appleRAM.RAMRun();
	}
}

3.接下来就是创建工厂类了,抽象工厂顾名思义就是抽象工厂类,所以先创建一个抽象接口再来创建两个工厂实现接口。

public interface interfaceFactory {//抽象工厂
	public CPU createCPU();
	public RAM createRAM();
}
public class WindowsFactory implements interfaceFactory{
	@Override
	public CPU createCPU() {
		return new WindowsCPU();
	}
	@Override
	public RAM createRAM() {
		return new WindowsRAM();
	}
}
public class AppleFactory implements interfaceFactory{
	@Override
	public CPU createCPU() {
		return new AppleCPU();
	}
	@Override
	public RAM createRAM() {
		return new AppleRAM();
	}
}

4.到Test类测试一下

public class Test {
	public static void main(String[] args) {
//		WindowsCPU  windowsCPU = new WindowsCPU();
//		windowsCPU.CPURun();

//		WindowsRAM windowsRAM = new WindowsRAM();
//		windowsRAM.RAMRun();

//		AppleCPU appleCPU = new AppleCPU();
//		appleCPU.CPURun();

//		AppleRAM appleRAM = new AppleRAM();
//		appleRAM.RAMRun();

		WindowsFactory  windowsFactory= new WindowsFactory();
		CPU windowsCPU = windowsFactory.createCPU();
		RAM windowsRAM = windowsFactory.createRAM();
		windowsCPU.CPURun();
		windowsRAM.RAMRun();
		
		AppleFactory appleFactory = new AppleFactory();
		CPU appleCPU = new AppleFactory().createCPU();
		RAM appleRAM = new AppleFactory().createRAM();
		appleCPU.CPURun();
		appleRAM.RAMRun();
	}
}

这只是其中一种方式,还可以创建Windows,Apple抽象类,创建CPU工厂和RAM工厂,CPU工厂生产Windows型和Apple型,RAM工厂同理。方式不唯一。

总结:工厂模式乃是一一对应的关系,一个工厂生产一种产品;抽象工厂模式乃是一个工厂生产多种产品。

PS:会写一篇简单工厂模式,工厂模式,抽象工厂模式的对比总结。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的抽象工厂模式是一种创建型设计模式,它可以将一组相关的产品集合起来,并且创建整个产品家族。与工厂方法模式不同的是,抽象工厂模式有多个抽象产品类,每个抽象产品类都有对应的具体产品类。抽象工厂模式中声明了多个工厂方法,用于创建不同类型的产品。抽象工厂可以是接口、抽象类或者具体类。 在Java实现抽象工厂模式时,我们需要定义抽象工厂接口或抽象类,其中包含多个工厂方法,用于创建不同类型的产品。具体工厂类需要实现抽象工厂接口或继承抽象工厂类,并实现工厂方法。具体产品类需要实现相应的抽象产品类。客户端调用时可以通过抽象工厂对象获取不同类型的产品实例。 使用抽象工厂模式的优点是可以将一组相关的产品集合起来,并且创建整个产品家族的模式。这样可以提供更高层次的抽象和灵活性,使得系统更易于扩展和维护。但是抽象工厂模式也有一些缺点,例如增加新的产品族会比较麻烦,需要修改抽象工厂接口或抽象工厂类以及所有的具体工厂类。抽象工厂模式适用于需要创建一系列相关或相互依赖的对象的场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [java设计模式【抽象工厂模式】](https://blog.csdn.net/qq_42872720/article/details/130724519)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [java设计模式-抽象工厂类详解](https://blog.csdn.net/qq_48642405/article/details/122062202)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值