概括
名称 | Abstract Factory |
结构 | |
动机 | 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 |
适用性 |
|
解析
形象比喻:
ABSTRACT FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory
工厂模式:
客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。
1.AbstractFactory
声明一个创建抽象产品对象的操作接口。
2.ConcreteFactory
实现创建具体产品对象的操作。
3.AbstractProduct
为一类产品对象声明一个接口。
4.ConcreteProduct
定义一个将被相应的具体工厂创建的产品*象。
实现abstractProduct接口。
5.Client
仅使用由AbstractFactory和AbstractProduct类声明的接口
实例
涉及的文件有
IFactory.java
- ProductFactory.java
IProduct.java
- SoftwareProduct.java
- HardwareProduct.java
TestMain.java
都是同一从ProductFactory中获取SoftwareProduct和HardwareProduct的实例。
/**
* @author oscar999
* @date 2013-7-17
* @version V1.0
*/
package designptn.abstracfac;
public interface IFactory {
IProduct createSoftProduct();
IProduct createHardProduct();
}
/**
* @author oscar999
* @date 2013-7-17
* @version V1.0
*/
package designptn.abstracfac;
public class ProductFactory implements IFactory {
@Override
public IProduct createSoftProduct() {
// TODO Auto-generated method stub
return new SoftwareProduct();
}
@Override
public IProduct createHardProduct() {
// TODO Auto-generated method stub
return new HardwareProduct();
}
}
/**
* @author oscar999
* @date 2013-7-17
* @version V1.0
*/
package designptn.abstracfac;
public interface IProduct {
void product();
}
/**
* @author oscar999
* @date 2013-7-17
* @version V1.0
*/
package designptn.abstracfac;
public class SoftwareProduct implements IProduct {
@Override
public void product() {
// TODO Auto-generated method stub
System.out.println("Product a Software");
}
}
/**
* @author oscar999
* @date 2013-7-17
* @version V1.0
*/
package designptn.abstracfac;
public class HardwareProduct implements IProduct {
@Override
public void product() {
// TODO Auto-generated method stub
System.out.println("Product a Hardware");
}
}
/**
* @author oscar999
* @date 2013-7-17
* @version V1.0
*/
package designptn.abstracfac;
public class TestMain {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
IFactory factory = new ProductFactory();
IProduct softProduct = factory.createSoftProduct();
IProduct hardProduct = factory.createHardProduct();
softProduct.product();
hardProduct.product();
}
}
与工厂方法的区别
工厂方法强调的是类的实例不再是使用new Class()的方式获取,而是通过定义一个工厂类,从工厂类的方法中获取。
而抽象工厂强调的是同一的调用接口。