工厂模式目的:为了创建对象,创建对象的逻辑封装在工厂类中,使客户端与创建对象分割开,客户端不需要考虑接口或类的不同实现,只需要通过工厂(工厂方法或者抽象工厂)获取接口实现的一个实例即可。
这样的好处是重构的改变只会对一个点影响。
通常情况下,工厂本身会被实现为单例或者是静态类,因为一般来说只需要一个工厂实例即可,这么做将会是工厂对象的创建集中到一个地方,有利于更好地对代码的修改和更新,并减少错误。
工厂模式有两种模式:
一个是工厂方法:提供一个方法返回一个新创建的对象。
另外一个是抽象工厂:将创建对象委托给子类实现。
工厂方法:GoF一书是这样描述工厂方法模式的:“定义一个用于创建对象的接口,不过让其子类决定实例化哪个类”。Head First Design Patterns补充了一点:“工厂方法将类的实例化推迟到子类”。
使用普通代码实现工厂方法:
DrinkMachine.class
/**
* 抽象类
* @author Administrator
*抽象工厂模式,将对象的创建委托给子类
*/
public abstract class DrinkMachine {
//抽象方法 给子类创建对象
public abstract Drink dispenseDrink();
public String displayMessage()
{
return "Thank you for your custom.";
}
}
CoffeeMachine.class
/**
* 工厂类
* @author Administrator
*工厂方法模式:提供一个方法来返回新创建的对象
*/
public class CoffeeMachine extends DrinkMachine{
@Override
public Drink dispenseDrink() {
// TODO Auto-generated method stub
return new Coffee();
}
}
SoftDrinkMachine.class
/**
* 工厂方法模式:提供一个方法来返回新创建的对象
* @author Administrator
*
*/
public class SoftDrinksMachine extends DrinkMachine
{
@Override
public Drink dispenseDrink() {
// TODO Auto-generated method stub
return new SoftDrink();
}
}
Drink接口
public interface Drink {}
Coffee.class
public class Coffee implements Drink {
}
SoftDrink.class
public class SoftDrink implements Drink
{
}