今天在项目中用单例设计模式解决了问题,突然对设计模式大感兴趣。所以决定从最简单的模式学起走。所以看了工厂模式。发现一个问题。是不是每个模式都对应了java里面的基本知识点。单例模式利用了java的static域。工厂模式则利用了java的多态。
1. 简单工厂模式。
a. 需要一个产品接口。所有产品实现该接口
b. 需要一个工厂。创建一个返回产品接口类型的方法。这里就利用了多态。当调用此方法的时候就返回一个 接口类型,在工厂里面已经处理了你需要返回的实例类。
//第一要素 产品接口 public interface CarInterface { public void driver(); } public class Bmw implements CarInterface { @Override public void driver() { System.out.println("this is bmw"); } } public class Benz implements CarInterface { @Override public void driver() { System.out.println("this is benz"); } } //第二要素 工厂 创建一个返回接口类型方法。根据传递的参数决定要返回的类 public class Factory { public CarInterface factory(String benz){ if(benz.equals("benz")){ return new Benz(); }else if(benz.equals("bmw")){ return new Bmw(); } return null; } }
2. 工厂方法模式。
工厂方法模式个人理解是将工厂模式进行了一层包装。从建立一个工厂实例类到建立一个工厂接口或者抽象类。不同的抽象工厂返回相同的产品接口。代码跟简单工厂模式一样,只是想工厂类变成实现一个工厂接口或者抽象类。
//抽象产品角色 public interface Moveable { void run(); } //具体产品角色 public class Plane implements Moveable { @Override public void run() { System.out.println("plane...."); } } public class Broom implements Moveable { @Override public void run() { System.out.println("broom....."); } } //抽象工厂 public abstract class VehicleFactory { abstract Moveable create(); } //具体工厂 public class PlaneFactory extends VehicleFactory{ public Moveable create() { return new Plane(); } } public class BroomFactory extends VehicleFactory{ public Moveable create() { return new Broom(); } }
3. 抽象工厂模式。
相对来说我觉的这个模式最符合我平常的写法。
//抽象工厂类 public abstract class AbstractFactory { public abstract Vehicle createVehicle(); public abstract Weapon createWeapon(); public abstract Food createFood(); } //具体工厂类,其中Food,Vehicle,Weapon是抽象类, public class DefaultFactory extends AbstractFactory{ @Override public Food createFood() { return new Apple(); } @Override public Vehicle createVehicle() { return new Car(); } @Override public Weapon createWeapon() { return new AK47(); } }