* 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("葡萄尝起来有点酸"); } }