常用设计模式总结--抽象工厂

Abstract Factory ,抽象工厂

抽象工厂是一种创建型方法,所谓工厂,顾名思义就是一个车间,里面生产各种各样的组件,既然是抽象的,对应到代码里面,就是定义一些抽象的方法,然后在集体的工厂里面实现。

用传统的制造业来举例比较恰当,比如汽车制造业,现在的汽车制造业都已经集团化了,每家汽车制造商都有好多工厂,每个工厂用来生产某几个具体型号的轿车。站在集团的角度,每个工厂都生产引擎,轮胎,然后拼装成整车。

从软件的角度抽象,引擎、轮胎都有统一的父类 element, 而每个工厂也有着统一的父类 VehicleFactory.

类图如下


 

 常用设计模式总结--抽象工厂_第1张图片

 

来看具体的源代码

 

1 Element.java

package zl.study.designpattern.abstfactory; public interface Element { }

2 Engine.java

package zl.study.designpattern.abstfactory; public class Engine implements Element { public static int NORMAL_ENGINE = 180; public static int RACE_ENGINE = 400; /* 引擎的马力*/ public int power ; public Engine(int power){ this.power = power; } }

2.1 NormalEngine.java

package zl.study.designpattern.abstfactory; public class NormalEngine extends Engine{ public NormalEngine(){ super(NORMAL_ENGINE); } }

2.2 RaceEngine.java

package zl.study.designpattern.abstfactory; public class RaceEngine extends Engine{ public RaceEngine(){ super(RACE_ENGINE); } }

3 Wheel.java

package zl.study.designpattern.abstfactory; public class Wheel { public static int NORMAL_WHEEL = 15; public static int RACE_WHEEL = 20; public int width; public Wheel(int width){ this.width = width; } }

3.1 NormalWheel.java


package zl.study.designpattern.abstfactory; public class NormalWheel extends Wheel{ public NormalWheel(){ super(NORMAL_WHEEL); } } 

3.2 RaceWheel.java

package zl.study.designpattern.abstfactory; public class RaceWheel extends Wheel{ public RaceWheel(){ super(RACE_WHEEL); } }

 

4 Vehicle.java

package zl.study.designpattern.abstfactory; import java.util.LinkedList; import java.util.List; public abstract class Vehicle { public Engine engine; public List<Wheel> wheels; public void setEngine( Engine engine){ this.engine = engine; } public Engine getEngine(){ return this.engine; } public void addWheel(Wheel wheel){ if( null == wheels){ wheels = new LinkedList<Wheel>(); } wheels.add(wheel); } }

4.1 NormalVehicle.java

package zl.study.designpattern.abstfactory; /** * 最终产品:普通交通工具 * @author peter * */ public class NormalVehicle extends Vehicle{ public String toString(){ return new String("this is normal car!"); } }

4.2 RaceVehicle.java

package zl.study.designpattern.abstfactory; /** * 最终产品:高性能交通工具 * @author peter * */ public class RaceVehicle extends Vehicle{ public String toString(){ return new String("this is race car"); } }

5 VehicleFactory.java

package zl.study.designpattern.abstfactory; public interface VehicleFactory { public Vehicle makeVehicle(); public Wheel makeWheel(); public Engine makeEngine(); }

5.1 NormalVehicleFactory.java

package zl.study.designpattern.abstfactory; /** * 生产普通交通工具的工厂 * @author peter * */ public class NormalVehicleFactory implements VehicleFactory{ @Override public Vehicle makeVehicle() { return new NormalVehicle(); } @Override public Engine makeEngine() { return new NormalEngine(); } @Override public Wheel makeWheel() { return new NormalWheel(); } }

5.2 RaceVehicleFactory.java

package zl.study.designpattern.abstfactory; /** * 生产高性能交通工具的工厂 * @author peter * */ public class RaceVehicleFactory implements VehicleFactory{ @Override public Vehicle makeVehicle() { // TODO Auto-generated method stub return new RaceVehicle(); } @Override public Engine makeEngine() { return new RaceEngine(); } @Override public Wheel makeWheel() { return new RaceWheel(); } }

 

6 测试程序

 

package zl.study.designpattern.abstfactory.test; import zl.study.designpattern.abstfactory.Engine; import zl.study.designpattern.abstfactory.NormalVehicleFactory; import zl.study.designpattern.abstfactory.RaceVehicleFactory; import zl.study.designpattern.abstfactory.Vehicle; import zl.study.designpattern.abstfactory.VehicleFactory; import zl.study.designpattern.abstfactory.Wheel; public class AbstFactoryTest { public static void main(String args[]){ VehicleFactory normalFactory = new NormalVehicleFactory(); Vehicle normalCar = normalFactory.makeVehicle(); Wheel wheel1 = normalFactory.makeWheel(); Wheel wheel2 = normalFactory.makeWheel(); Wheel wheel3 = normalFactory.makeWheel(); Wheel wheel4 = normalFactory.makeWheel(); Engine engine = normalFactory.makeEngine(); /** * 向外暴露了生产汽车的细节 */ normalCar.setEngine(engine); normalCar.addWheel(wheel1); normalCar.addWheel(wheel2); normalCar.addWheel(wheel3); normalCar.addWheel(wheel4); System.out.println(normalCar); } }

 

 

你可能感兴趣的:(设计模式,String,制造,Class,交通,interface)