设计模式-抽象工厂模式

1.抽象工厂模式介绍

抽象工厂模式,也是创建型模式之一。

2.抽象工厂模式的定义

为创建一组相关或者相互依赖的对象提供一个接口,而不需要指定它们的具体类

3.抽象工厂的使用场景

(1) 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
(2) 这个系统有多于一个的产品族,而系统只消费其中某一产品族。
(3) 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
(4) 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

4.UML类图



5.工厂方法模式和抽象工厂模式的区别

5.1 工厂方法模式

一个抽象产品类,可以派生出多个具体产品类。   

一个抽象工厂类,可以派生出多个具体工厂类。 

          每个具体工厂类只能创建一个具体产品类的实例。 

  5.2 抽象工厂模式

多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 

          一个抽象工厂类,可以派生出多个具体工厂类。 

          每个具体工厂类可以创建多个具体产品类的实例。 

 5.3 区别

工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。

          工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

6.具体实现

现A商场和B商场两个商场做促销活动,他们促销的商品都有水果和饮料,促销商品列表该如何封装实现呢?不妨用抽象工厂模式试下,商场作为工厂,促销列表作为实体类。
1.抽象工厂
	/**
	 * 抽象工厂
	 * Created by Teaphy
	 * 2016/3/21.
	 */
	public abstract class Factory {


		abstract Fruit createFruit();


		abstract Drink createDrink();
	}

2.具体工厂

	/**
	 * 具体工厂实现类
	 * Created by Teaphy
	 * 2016/3/21.
	 */
	public class MarkAFactory extends Factory {
		Fruit createFruit() {
			return  new AppleOfFruit("Mark_A_Factory");
		}


		Drink createDrink() {
			return new CokeOfDrink("Mark_A_Factory");
		}
	}
	
	/**
	 * 具体工厂实现类
	 * Created by Teaphy
	 * 2016/3/21.
	 */
	public class MarkBFactory extends Factory {
		Fruit createFruit() {
			return  new BananaOfFruit("Mark_B_Factory");
		}


		Drink createDrink() {
			return new SpriteOfDrink("Mark_B_Factory");
		}
	}
	


3.产品抽象类

	/**
	 * 产品抽象类 - 水果
	 * Created by Teaphy
	 * 2016/3/21.
	 */
	public abstract class Fruit {


		abstract void SpecialOffer();
	}
	
	/**
	 * 产品抽象类 - 饮料
	 * Created by Teaphy
	 * 2016/3/21.
	 */
	public abstract class Drink {


		abstract void SpecialOffer();
	}

4.具体产品类

	/**
	 * 具体产品类 - 苹果
	 * Created by Teaphy
	 * 2016/3/21.
	 */
	public class AppleOfFruit extends Fruit {


		private String fac;


		public AppleOfFruit(String fac) {
			this.fac = fac;
		}


		void SpecialOffer() {
			System.out.println("BananaOfFruit - SpecialOffer : " + fac);
		}
	}
	
	/**
	 * 具体产品类 - 香蕉
	 * Created by Teaphy
	 * 2016/3/21.
	 */
	public class BananaOfFruit extends Fruit {


		private String fac;


		public BananaOfFruit(String fac) {
			this.fac = fac;
		}


		void SpecialOffer() {
			System.out.println("BananaOfFruit - SpecialOffer :" + fac);
		}
	}
	
	
	/**
	 *  具体产品类 - 可乐
	 * Created by Teaphy
	 * 2016/3/21.
	 */
	public class CokeOfDrink extends Drink{


		private String fac;


		public CokeOfDrink(String fac) {
			this.fac = fac;
		}


		void SpecialOffer() {
			System.out.println("CokeOfDrink - SpecialOffer : " + fac);
		}
	}
	
	
	/**
	 * 具体产品类 - 雪碧
	 * Created by Teaphy
	 * 2016/3/21.
	 */
	public class SpriteOfDrink extends Drink{


		private String fac;


		public SpriteOfDrink(String fac) {
			this.fac = fac;
		}


		void SpecialOffer() {
			System.out.println("CokeOfDrink - SpecialOffer : " + fac);
		}
	}
	

5.测试类

	/**
	 * 测试类
	 * Created by Teaphy
	 * 2016/3/21.
	 */
	public class TestAbstractfactory {
		public static void main(String[] args) {
			Factory markA = new MarkAFactory();
			Fruit fruitA = markA.createFruit();
			Drink drinkA = markA.createDrink();


			fruitA.SpecialOffer();
			drinkA.SpecialOffer();


			Factory markB = new MarkBFactory();
			Fruit fruitB = markB.createFruit();
			Drink drinkB = markB.createDrink();


			fruitB.SpecialOffer();
			drinkB.SpecialOffer();
		}
	}

6.输出结果
	AppleOfFruit - SpecialOffer : Mark_A_Factory
	CokeOfDrink - SpecialOffer : Mark_A_Factory
	BananaOfFruit - SpecialOffer :Mark_B_Factory
	SpriteOfDrink - SpecialOffer : Mark_B_Factory


抽象工厂的功能是为一系列相关对象或相互依赖的对象创建一个接口。一定要注意,这个接口内的方法不是任意堆砌的,而是一系列相关或相互依赖的方法。




### 抽象工厂模式概述 抽象工厂模式是一种创建型设计模式,其核心在于提供了一种方式来创建一系列相关或相互依赖的对象,而不必指定它们的具体类[^2]。通过这种方式,客户端能够使用统一的接口来获取所需的产品实例,从而降低了系统组件之间的耦合度。 #### 模式的结构与工作原理 该模式主要由四个部分组成: - **抽象工厂(Abstract Factory)**:定义了一个用于创建一族具体产品对象的方法集合。 - **具体工厂(Concrete Factory)**:实现了抽象工厂所声明的操作,负责生产特定种类的产品系列。 - **抽象产品(Abstract Product)**:为每一种可能被生产的物品设定了通用接口。 - **具体产品(Concrete Product)**:实际要创建出来的实体类,继承自相应的抽象产品并实现其功能。 当客户请求某个类型的对象时,会调用相应工厂里的方法得到想要的结果;由于整个过程中只涉及到高层模块对于低层模块的引用(即仅知道如何操作抽象级别的成员),因此即使内部逻辑发生变化也不会影响到外部使用者。 #### 应用场景分析 此模式非常适合应用于以下情况: - 当应用程序存在多个可互换的产品线,并希望保持独立性以便于扩展新特性时不破坏现有代码; - 需要在运行期间动态决定应该采用哪一套设计方案来进行构建; - 要求确保同一版本下的各个组成部分始终一致地协同运作。 例如,在图形库中可以根据不同的渲染引擎选择合适的形状绘制器(如OpenGL vs DirectX)。再比如操作系统风格切换工具里根据不同主题调整窗口控件外观等都是很好的例子。 #### Java实现案例展示 下面给出一段简单的Java代码片段用来说明上述概念的应用: ```java // 定义两个层次的产品接口 public interface GUIFactory { Button createButton(); } public interface Button { void paint(); } ``` 接着分别针对Windows和MacOS平台定制化各自的GUI元素: ```java // Windows风格按钮 class WinButton implements Button { public void paint() { System.out.println("Render a button in the Windows style."); } } // MacOS风格按钮 class MacButton implements Button { public void paint() { System.out.println("Render a button in the macOS style."); } } ``` 最后建立对应的工厂类完成最终组装: ```java // 创建适用于Windows系统的UI部件制造者 class WinFactory implements GUIFactory { @Override public Button createButton() { return new WinButton(); } } // 创建适用于macOS系统的UI部件制造者 class MacFactory implements GUIFactory { @Override public Button createButton() { return new MacButton(); } } ``` 这样就可以很容易地根据当前环境配置选取适当的主题样式了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值