设计模式-抽象工厂模式

Provide an interface for creating families of related or dependent objects without specifying
their concrete classes.
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
public abstract class AbstractProductA {

		public void shareMethod() {
			
		}
		
		public abstract void doSomething();
	}
	
	public class ProductA1 extends AbstractProductA {

		@Override
		public void doSomething() {
			System.out.println("productA1 method..");
		}

	}
	
	public class ProductA2 extends AbstractProductA {

		@Override
		public void doSomething() {
			System.out.println("productA2 method.....");
		}

	}
	
	public abstract class AbstractProductB {

		public void shareMethod() {
			
		}
		
		public abstract void doSomething();
	}
	
	public class ProductB1 extends AbstractProductB {

		@Override
		public void doSomething() {
			System.out.println("productB1 method....");
		}
	}
	
	public class ProductB2 extends AbstractProductB {

		@Override
		public void doSomething() {
			System.out.println("productB2 method.....");
		}

	}
	
	public abstract class AbstractCreator {

		public abstract AbstractProductA createProductA();
		
		public abstract AbstractProductB createProductB();
	}
	
	public class Creator1 extends AbstractCreator {

		@Override
		public AbstractProductA createProductA() {
			return new ProductA1();
		}

		@Override
		public AbstractProductB createProductB() {
			return new ProductB1();
		}
	}
	
	public class Creator2 extends AbstractCreator {

		@Override
		public AbstractProductA createProductA() {
			return new ProductA2();
		}

		@Override
		public AbstractProductB createProductB() {
			return new ProductB2();
		}

	}
	
	public class Client {

		public static void main(String[] args) {
			
			AbstractCreator creator1 = new Creator1();
			AbstractCreator creator2 = new Creator2();
			
			AbstractProductA a1 = creator1.createProductA();
			AbstractProductA a2 = creator2.createProductA();
			
			AbstractProductB b1 = creator1.createProductB();
			AbstractProductB b2 = creator2.createProductB();
		}

	}

抽象工厂模式的优点
(1)封装性,每个产品实现类不是高层模块要关心的,它要关心的是什么?是接口、是抽象,它不关心对象是
如何创建的。它是由工厂类创建的,只要知道工厂类是谁,就能创造出一个需要的对象。
(2)产品族内的约束为非公开状态。

抽象工厂模式的使用场景
抽象工厂模式的使用场景定义非常简单:一个对象族(或是一组没有任何关系的对象)都有相同的约束,
则可以使用抽象工厂模式。
抽象工厂模式横向扩展容易,纵向扩展难。

你可能感兴趣的:(设计模式)