创建模式就是创建一个对象,象new一样,只是为达到某种目的用不同的模式来进行。
抽象工厂:提供一个接口创建一组相关的对象,不指定特别的具体类。
Provide an interface for creating families of related or dependent objects without specifying their concrete classes. [GoF, p87]
和工厂方法不一样的是,抽象工厂方法能创建多个相关的产品(Product)对象。
用UML整理:
客户需要根据不同的具体工厂,得到相应的产品对象
抽象工厂定义生产产品的方法
两个具体工厂实现
最后定义抽象产品和具体的产品
再定义一个抽象产品并相应的具体产品
抽象工厂模式比工厂模式复杂些,它需要生产一组相关的产品。你在实际中使用过吗?
-----------
参考资料:
http://home.earthlink.net/~huston2/dp/patterns.html
http://www.jdon.com/designpatterns/index.htm
抽象工厂:提供一个接口创建一组相关的对象,不指定特别的具体类。
Provide an interface for creating families of related or dependent objects without specifying their concrete classes. [GoF, p87]
和工厂方法不一样的是,抽象工厂方法能创建多个相关的产品(Product)对象。
用UML整理:
客户需要根据不同的具体工厂,得到相应的产品对象
package
org.benewu.patterns.abstractFactory;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
AbstractFactory factory = null;
factory = new ConcreteFactoryOne();
System.out.println(factory.makeProductOne().getName());
System.out.println(factory.makeProductTwo().getName());
factory = new ConcreteFactoryTwo();
System.out.println(factory.makeProductOne().getName());
System.out.println(factory.makeProductTwo().getName());
}
}
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
AbstractFactory factory = null;
factory = new ConcreteFactoryOne();
System.out.println(factory.makeProductOne().getName());
System.out.println(factory.makeProductTwo().getName());
factory = new ConcreteFactoryTwo();
System.out.println(factory.makeProductOne().getName());
System.out.println(factory.makeProductTwo().getName());
}
}
抽象工厂定义生产产品的方法
package
org.benewu.patterns.abstractFactory;
public abstract class AbstractFactory {
public abstract AbstractProductOne makeProductOne();
public abstract AbstractProductTwo makeProductTwo();
}
public abstract class AbstractFactory {
public abstract AbstractProductOne makeProductOne();
public abstract AbstractProductTwo makeProductTwo();
}
两个具体工厂实现
package
org.benewu.patterns.abstractFactory;
public class AbstractProductOne {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class AbstractProductOne {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package
org.benewu.patterns.abstractFactory;
public class AbstractProductTwo {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class AbstractProductTwo {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
最后定义抽象产品和具体的产品
package
org.benewu.patterns.abstractFactory;
public class AbstractProductOne {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class AbstractProductOne {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package
org.benewu.patterns.abstractFactory;
public class ProductOneFactoryOne extends AbstractProductOne {
public ProductOneFactoryOne(){
setName("org.patterns.abstractFactory.ProductOneFactoryOne");
}
}
public class ProductOneFactoryOne extends AbstractProductOne {
public ProductOneFactoryOne(){
setName("org.patterns.abstractFactory.ProductOneFactoryOne");
}
}
package
org.benewu.patterns.abstractFactory;
public class ProductOneFactoryTwo extends AbstractProductOne {
public ProductOneFactoryTwo(){
setName("org.patterns.abstractFactory.ProductOneFactoryTwo");
}
}
public class ProductOneFactoryTwo extends AbstractProductOne {
public ProductOneFactoryTwo(){
setName("org.patterns.abstractFactory.ProductOneFactoryTwo");
}
}
再定义一个抽象产品并相应的具体产品
package
org.benewu.patterns.abstractFactory;
public class AbstractProductTwo {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class AbstractProductTwo {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package
org.benewu.patterns.abstractFactory;
public class ProductTwoFactoryOne extends AbstractProductTwo {
public ProductTwoFactoryOne(){
setName("org.patterns.abstractFactory.ProductTwoFactoryOne");
}
}
public class ProductTwoFactoryOne extends AbstractProductTwo {
public ProductTwoFactoryOne(){
setName("org.patterns.abstractFactory.ProductTwoFactoryOne");
}
}
package
org.benewu.patterns.abstractFactory;
public class ProductTwoFactoryTwo extends AbstractProductTwo {
public ProductTwoFactoryTwo(){
setName("org.patterns.abstractFactory.ProductTwoFactoryTwo");
}
}
public class ProductTwoFactoryTwo extends AbstractProductTwo {
public ProductTwoFactoryTwo(){
setName("org.patterns.abstractFactory.ProductTwoFactoryTwo");
}
}
抽象工厂模式比工厂模式复杂些,它需要生产一组相关的产品。你在实际中使用过吗?
-----------
参考资料:
http://home.earthlink.net/~huston2/dp/patterns.html
http://www.jdon.com/designpatterns/index.htm