工厂方法模式
定义了一个创建对象的接口,由子类决定要实例化的子类是哪一个,工厂方法让类把实例化推迟到子类
工厂方法侧重于重用框架,只是具体对象的创建.由业务方自己根据需要创建,类似模板方法,都是重用算法,只是一个客户端自己定制方法,一个客户端自己创建对象
/**
 * 鼠标加工店
 */
public abstract class MouseStore {
    /**
     * 整个鼠标下单,获取鼠标元件,加工,包装,配送主体流程(算法)
     * 都已经定制好,只是鼠标元件这个对象根据地区不同,不确定
     * @return
     */
    public abstract Mouse createMouse();
    /**
     * 购买鼠标
     * @return
     */
    public Mouse orderMouse(){
        //xxx下单.
        Mouse mouse = createMouse();
        //商店的加工流程希望所有分店保持一致,但是鼠标原件可以根据地区找最适合的鼠标
        mouse.getName();
        //mouse.setColor("red");
        //mouse.setIcon("http://sdsdsd.jpg");
        //mouse.tiemo("ganghuamo");
        //mouse.baozhuang("xxx");
        //mouse.出货();
        //mouse.配送();
        return mouse;
    }
}
/**
 * 北京鼠标分店
 */
public class BeijingMouseStore extends MouseStore{
    /**
     * 子类
     * @return
     */
    @Override
    public Mouse createMouse() {
        //假如惠普电脑的产地就在北京,北京分店就拿惠普的鼠标原件
        return new HpMouse();
    }
}
抽象工厂提供一个接口,用于创建相关或依赖对象的家族,(Mouse,KeyBoard).
public interface Factory {
    // 生产鼠标
    Mouse createMouse();
    // 生产键盘
    KeyBoard createKeyBoard();
}
public class AcerFactory implements Factory {
    @Override
    public Mouse createMouse() {
        return new AcerMouse();
    }
    @Override
    public KeyBoard createKeyBoard() {
        return new AcerKeyBoard();
    }
}
public class LenovoFactory implements Factory {
    @Override
    public Mouse createMouse() {
        return new LenovoMouse();
    }
    @Override
    public KeyBoard createKeyBoard() {
        return new LenovoKeyBoard();
    }
}
抽象工厂主要是创建产品族,这些产品对象之间有一定的关系(像策略模式,产品组是否可以互相替换)
工厂方法重点在重用框架,框架唯一未确定的部分在于某个具体对象的创建(像模板方法)
模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。(类比工厂方法,其实可不可以想成是模板方法的特例,只是这个延迟到子类实现的方法是用于创建对象的)
这里说的框架也只是一些类.但是区别于工具类(Random,Math),是main方法的某一个环节,框架是main方法
eg:
//这里Collections::sort就相当于框架(模板方法模式,不过不用局限于是否使用继承).,排序算法已经是写好的(框架实现了该算法),其中变化的部分是对象的比较方法(我们实现).那排序算法就可以算一个框架.
Collections.sort(stus, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
return s1.getAge()-s2.getAge();
}
}
);
//这里的Math就是一个工具类
public void playGame(){
Student s =  new Student();
s.speal();
s.eat();
s.cost(Math.random());
}











网友评论