抽象工厂:多个抽象产品类,派生出多个具体产品类;一个抽象工厂类,派生出多个具体工厂类;每一个具体工厂类可建立多个具体产品类的实例。即提供一个建立一系列相关或相互依赖对象的接口,而无需指定他们的具体的类。“一对多”的关系html
package cn.xiaobo.AbstractFactory;
/**
* 抽象的工厂
* @author Administrator
*
*/
public interface AbstractFactory {ide
public ProductA factoryA();
public ProductB factoryB();
}测试
package cn.xiaobo.AbstractFactory;spa
/**
* 抽象的A产品
* @author Administrator
*
*/
public interface ProductA {.net
public void method1();
public void method2();
}设计
package cn.xiaobo.AbstractFactory;
/**
* 抽象的B产品
* @author Administrator
*
*/
public interface ProductB {
public void method1();
public void method2();
}htm
package cn.xiaobo.AbstractFactory;对象
/**
* 具体的等级为1的A产品
* @author Administrator
*
*/
public class ConcreateProductA1 implements ProductA{blog
@Override
public void method1() {
System.out.println("生产1等级的A产品method1方法");
}
@Override
public void method2() {
System.out.println("生产1等级的A产品method2方法");
}
}接口
package cn.xiaobo.AbstractFactory;
/**
* 具体的等级为2的A产品
* @author Administrator
*
*/
public class ConcreateProductA2 implements ProductA{
@Override
public void method1() {
System.out.println("生产2等级的A产品method1方法");
}
@Override
public void method2() {
System.out.println("生产2等级的A产品method2方法");
}
}
package cn.xiaobo.AbstractFactory;
/**
* 具体的等级为1的B产品
* @author Administrator
*
*/
public class ConcreateProductB1 implements ProductB{
@Override
public void method1() {
System.out.println("生产1等级的B产品的method1");
}
@Override
public void method2() {
System.out.println("生产1等级的B产品的method2");
}
}
package cn.xiaobo.AbstractFactory;
/**
* 具体的等级为2的B产品
* @author Administrator
*
*/
public class ConcreateProductB2 implements ProductB{
@Override
public void method1() {
System.out.println("生产2等级的B产品的method1");
}
@Override
public void method2() {
System.out.println("生产2等级的B产品的method2");
}
}
package cn.xiaobo.AbstractFactory;
/**
* 生产产品等级为1的具体工厂
* @author Administrator
*
*/
public class ConcreateFactory1 implements AbstractFactory{
@Override
public ProductA factoryA() {
// TODO Auto-generated method stub
return (ProductA) new ConcreateProductA1();
}
@Override
public ProductB factoryB() {
// TODO Auto-generated method stub
return (ProductB) new ConcreateProductB1();
}
}
package cn.xiaobo.AbstractFactory;
/**
* 生产产品等级为2的具体工厂
* @author Administrator
*
*/
public class ConcreateFactory2 implements AbstractFactory{
@Override
public ProductA factoryA() {
// TODO Auto-generated method stub
return (ProductA) new ConcreateProductA2();
}
@Override
public ProductB factoryB() {
// TODO Auto-generated method stub
return (ProductB) new ConcreateProductB2();
}
}
package cn.xiaobo.AbstractFactory;
/**
* 抽象工厂模式相对于工厂方法模式来讲,每一个具体工厂能够生产一族产品(即多种产品);而工厂方法模式是具体工厂生产相应的具体产品,只能生产一种产品。
* 当产品族中只有一种产品时抽象工厂模式退化成工厂方法模式。
* @author Administrator
*
*/
public class Customer {
public static void main(String[] args) {
ConcreateFactory1 concreateFactory1=new ConcreateFactory1();
ConcreateFactory2 concreateFactory2=new ConcreateFactory2();
concreateFactory1.factoryA().method1();
concreateFactory1.factoryB().method1();
concreateFactory2.factoryA().method1();
concreateFactory2.factoryB().method1();
}
}
生产1等级的A产品method1方法
生产1等级的B产品的method1
生产2等级的A产品method1方法
生产2等级的B产品的method1
优势:
一、抽象工厂模式隔离了具体类的生产,使得客户并不须要知道什么被建立。
二、当一个产品族中的多个对象被设计成一块儿工做时,它能保证客户端始终只使用同一个产品族中的对象。
三、增长新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点:
增长新的产品等级结构很复杂,须要修改抽象工厂和全部的具体工厂类,对“开闭原则”的支持呈现倾斜性。