欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式(2)工厂方法

程序员文章站 2024-01-09 23:38:34
...

定义:

定定义一个用于创建对象的接口,让子类决定实例化哪一个类, Factory Method使一个类的实例化延迟到其子类。

本质:

延迟到子类来选择实现。

优点:

1、可以在不知具体实现的情况下编程,工厂方法模式可以让你在实现功能的时候,如果需要某个产品对象, 只需要使用产品的接口即可, 而无需关心具体的实现。选择具体实现的任务延迟到子类去完成。

2、更容易扩展对象的新版本,工厂方法给子类提供了一个挂钩,使得扩展新的对象版本变得非常容易。

缺点:

具体产品对象和工厂方法的耦合性,在工厂方法模式中,工厂方法是需要创建产品对象的,也就是需要选择具体的产品对象,并创建它们的实例,因此具体产品对象和工厂方法是耦合的。

不用设计模式示例:

public class WithoutFactoryMethodPatternDemo {
	
	public static void main(String[] args) {
		Product product1 = Product1Factory.createProduct();
		Product product2 = Product2Factory.createProduct();
		Product product3 = Product3Factory.createProduct();
		
		product1.execute();
		product2.execute();
		product3.execute();

		/**
		 * 存在问题:
		 * 工厂类中,有相同的通用逻辑,如果通用逻辑发生修改,需要到每一个工厂中修改代码
		 */

	}
	
	public interface Product {
		
		void execute();
		
	}
	
	public static class Product1 implements Product {

		@Override
		public void execute() {
			System.out.println("产品1的功能逻辑");
 		}
 		
	}
	
	public static class Product2 implements Product {

		@Override
		public void execute() {
			System.out.println("产品2的功能逻辑");
 		}
 		
	}
	
	public static class Product3 implements Product {

		@Override
		public void execute() {
			System.out.println("产品3的功能逻辑");
 		}
 		
	}
	
	public static class Product1Factory {
		
		public static Product createProduct() {
			System.out.println("生产产品的通用逻辑,修改");  
			System.out.println("生产产品1的特殊逻辑");
			return new Product1();
		}
		
	}
	
	public static class Product2Factory {
		
		public static Product createProduct() {
			System.out.println("生产产品的通用逻辑,修改");  
			System.out.println("生产产品2的特殊逻辑");
			return new Product2();
		}
		
	}
	
	public static class Product3Factory {
		
		public static Product createProduct() {
			System.out.println("生产产品的通用逻辑");  
			System.out.println("生产产品3的特殊逻辑");
			return new Product3();
		}
		
	}
	
}

使用设计模式示例:

public class FactoryMethodPatternDemo {
	
	public static void main(String[] args) {
		Product product1 = Product1Factory.get().createProduct();
		Product product2 = Product2Factory.get().createProduct();
		Product product3 = Product3Factory.get().createProduct();
		
		product1.execute();
		product2.execute();
		product3.execute();
	}

	public interface Product {
		
		void execute();
		
	}
	
	public static class Product1 implements Product {

		@Override
		public void execute() {
			System.out.println("产品1的功能逻辑");
 		}
 		
	}
	
	public static class Product2 implements Product {

		@Override
		public void execute() {
			System.out.println("产品2的功能逻辑");
 		}
 		
	}
	
	public static class Product3 implements Product {

		@Override
		public void execute() {
			System.out.println("产品3的功能逻辑");
 		}
 		
	}
	
	public static abstract class AbstractProductFactory {
		
		public Product createProduct() {
			commonCreate();
			return specificCreate();
		}
		
		private void commonCreate() {
			System.out.println("生产产品的通用逻辑,修改");  
		}
		
		protected abstract Product specificCreate();
		
	}
	
	public static class Product1Factory extends AbstractProductFactory {
		
		private static final Product1Factory instance = new Product1Factory();
		
		private Product1Factory() {
			
		}
		
		public static Product1Factory get() {
			return instance;
		}
		
		@Override
		public Product specificCreate() {
			System.out.println("生产产品1的特殊逻辑");
			return new Product1();
		}
		
	}
	
	public static class Product2Factory extends AbstractProductFactory {
		
		private static final Product2Factory instance = new Product2Factory();
		
		private Product2Factory() {
			
		}
		
		public static Product2Factory get() {
			return instance;
		}
		
		@Override
		public Product specificCreate() {
			System.out.println("生产产品2的特殊逻辑");
			return new Product2();
		}
		
	}
	
	public static class Product3Factory extends AbstractProductFactory {
		
		private static final Product3Factory instance = new Product3Factory();
		
		private Product3Factory() {
			
		}
		
		public static Product3Factory get() {
			return instance;
		}
		
		@Override
		public Product specificCreate() {
			System.out.println("生产产品3的特殊逻辑");
			return new Product3();
		}
		
	}
	
}

何时选用:

1、如果一个类需要创建某个接口的对象,但是又不知道具体的实现,这种情况可以选用工厂方法模式,把创建对象的工作延迟到子类中去实现。

2、如果一个类本身就希望由它的子类来创建所需的对象的时候,应该使用工厂方法模式。

相关模式:

工厂方法模式和模板方法模式

这两个模式外观类似,都有一个抽象类,然后由子类来提供一些实现,但是工厂方法模式的子类专注的是创建产品对象,而模板方法模式的子类专注的是为固定的算法骨架提供某些步骤的实现。这两个模式可以组合使用,通常在模板方法校式里面,使用工厂方法来创建模板方法衙要的对象。