标签:
工厂方法模式
定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.
工厂方法是一个类的实例化延迟到其子类
/*************************面包师*****************************/
//面包师类
public class BreadMaker{
public void getBread(){}
}
//黑面包
public class BlackBread extends BreadMaker{
@Override
public void getBread(){
System.out.println("烤出黑面包");
}
}
//蜂蜜面包
public class HoneyBread extends BreadMaker{
@Override
public void getBread(){
System.out.println("烤出蜂蜜面包");
}
}
//白面包
public class WhiteBread extends BreadMaker{
@Override
public void getBread(){
System.out.println("烤出白面包");
}
}
/**********************工厂***********************************/
//工厂接口
interface IFactory {
public BreadMaker createBread();
}
//黑面包工厂
public class BlackBreadFactory implements IFactory{
@Override
public BreadMaker createBread() {
// TODO Auto-generated method stub
return new BlackBread();
}
}
//蜂蜜面包工厂
public class HoneyBreadFactory implements IFactory{
@Override
public BreadMaker createBread() {
// TODO Auto-generated method stub
return new HoneyBread();
}
}
//白面包工厂
public class WhiteBreadFactory implements IFactory{
@Override
public BreadMaker createBread() {
// TODO Auto-generated method stub
return new WhiteBread();
}
}
/*************************** 客户端实现*******************************/
public static void main(String[] args){
//面包工厂
IFactory breadFactory;
//面包师
BreadMaker breadMaker;
//顾客要黑面包
breadFactory = new BlackBreadFactory();//实例化黑面包工厂
breadMaker = breadFactory.BlackBread();//实例化黑面包师
breadMaker.getBread();//制作黑面包
//顾客要蜂蜜面包
breadFactory = new HoneyBreadFactory();//实例化蜂蜜面包工厂
breadMaker = breadFactory.HoneyBread();//实例化蜂蜜面包师
breadMaker.getBread();//制作蜂蜜面包
//顾客要白面包
breadFactory = new WhiteBreadFactory();//实例化白面包工厂
breadMaker = breadFactory.WhiteBread();//实例化白面包师
breadMaker.getBread();//制作白面包
}
使用范围: 1.一个类不知道它所创建的对象的类时. 2. 一个类希望由它的子类来指定它所创建的对象时. 3. 类将创建对象的职责委托给多个子类中的某一个.
如果产品种类比较少可以运用其他更简单的方法,比如一种叫简单工厂模式的,如果产品种类比较丰富可以选择工厂方法模式
抽象工厂模式
定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.
代码示例: 如果还想要销售披萨饼, 而且面包师也会做披萨的话,在上面的工厂接口中添加 制作披萨的接口方法
PizzaMaker createPizza(); //在IFactory接口中添加 PizzaMaker 是披萨师类, 类似面包师类
使用范围: 1. 一个系列要独立于它的产品的创建,组合和表示时.
2. 一个系统要由多个产品系列的一个来配置时
3. 当要提供一个产品类库,而只要显示它们的接口而不是实现时
4. 要强调一系列相关的产品对象的设计以便进行联合使用时
缺点: 如果产品需求改变,可能会需要在声明过产品类的地方进行大量的修改. 可以通过反射+抽象工厂模式结合
标签:
原文地址:http://my.oschina.net/u/942298/blog/372270