设计模式--2.工厂方法模式

* 1. 工场方法模式:
* 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法,使一个类的实例化,延迟到其子类


* 2. 工场方法通用类图
* (1) 抽象产品类 Product,负责定义产品的共性
* (2) Creator为抽象创建工厂类
* (3) ConcreteCreator 为抽象创建工厂类的具体实现类,负责具体的创建产品类
* (4) ConcreteProduct 即产品的具体实现类,由ConcreteCreator创建
*
* 3. 工场方法模式的优点
* (1) 良好的封装性,代码结构清晰
* (2) 优秀的扩展性。在增加产品类的情况下(如,要增加一个草莓类),只要适当修改工厂类,或扩展一个工厂类,只需增加一个草莓类,工厂类不需要
* 做任何改变。
* (3) 屏蔽产品类。产品类的实现类如何变化,调用者并不需要知道,它只关心产品的接口,只要接口不变化,系统中的上层模块就不会发生变化。
* (4) 解耦。
* a.符合迪米特法则,不需要的不去交流
* b.符合依赖倒置法则,只依赖产品的抽象类
* c.符合里氏替换法则,使用产品的子类,替换产品的父类
*
* 4.简单工厂模式:
* 去掉抽象工厂

 

场景类

public class 场景类 {
    private void growFruit(){
        AbstractFruitFactory absFruitFactory = new FruitFactory();
        
        // 1.Apple
        Apple apple = absFruitFactory.growFruit(Apple.class);
        System.out.println(apple.getColor());
        apple.taste();
        
        // 2.Banana
        Banana banana = absFruitFactory.growFruit(Banana.class);
        System.out.println(banana.getColor());
        banana.taste();
        
        // 3.grape
        Grapes grape = absFruitFactory.growFruit(Grapes.class);
        System.out.println(grape.getColor());
        grape.taste();
    }
    
    public static void main(String[] args) {
        场景类 c = new 场景类();
        c.growFruit();
    }
}

 

AbstractFruitFactory

public abstract class AbstractFruitFactory {
    
    // 抽象工厂,收割水果
    public abstract <T extends Fruit> T growFruit(Class<T>  c); 
}

FruitFactory

public class FruitFactory extends AbstractFruitFactory {

    @SuppressWarnings("unchecked")
    @Override
    public <T extends Fruit> T growFruit(Class<T> c) {
        Fruit fruit = null;
        try{
            fruit = (T) Class.forName(c.getName()).newInstance();
        }catch(Exception e){
            System.out.println("收割水果出现错误");
        }
        return (T) fruit;
    }

}

Fruit类

public interface Fruit {
    String getColor();
    
    void taste();
}

具体产品类

Banana

public class Banana implements Fruit{

    @Override
    public String getColor() {
        return "香蕉是黄色的";
    }

    @Override
    public void taste() {
         System.out.println("香蕉尝起来有点面");
    }

}

Apple

public class Apple implements Fruit {

    @Override
    public String getColor() {
        return "苹果是红的";
    }

    @Override
    public void taste() {
         System.out.println("苹果尝起来很甜");
    }

}

Grapes

public class Grapes implements Fruit {

    @Override
    public String getColor() {
        return "葡萄是紫的";
    }

    @Override
    public void taste() {
         System.out.println("葡萄尝起来有点酸");
    }

}

 

posted @ 2016-07-09 17:14  浮白斋主人  阅读(215)  评论(0编辑  收藏  举报