标签:cto 指定 技术 run 创建者 开始 img factory string
什么是工厂方法?什么是抽象工厂?
工厂方法是指工厂生产产品,而抽象工厂是生产产品系列。例如,工厂方法是只生产运输工具比如马车、公共汽车、自行车,而抽象工厂生产轮胎、螺丝钉交通工具零件。
工厂方法模式定义了一个创建对象的接口,但由子类决定实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
交通工具创建者类
public interface VehicleFactory { Vehicle create(); } public class BicycleFactory implements VehicleFactory { @Override public Vehicle create() { return new Bicycle(); } } public class CarriageFactory implements VehicleFactory{ public Vehicle create() { return new Carriage(); } } public class BusFactory implements VehicleFactory{ @Override public Vehicle create() { return new Bus(); } }
产品类
public interface Vehicle { void run(); } public class Bicycle implements Vehicle { @Override public void run() { System.out.println("自行車 蹬蹬蹬"); } } public class Bus implements Vehicle{ @Override public void run() { System.out.println("bus 咚咚咚"); } } public class Carriage implements Vehicle { @Override public void run() { System.out.println("马车 撇撇撇"); } }
客户端
public class Client { public static void main(String[] args) { VehicleFactory factory=new CarriageFactory(); Vehicle vehicle=factory.create(); vehicle.run(); } }
public interface AbstractFactory { //骑的坐骑 Vehicle createVehicle(); //拿的武器 Weapon createWeapon(); //补充的粮食 Food createFood(); } class CarriageFacetory implements AbstractFactory{ @Override public Vehicle createVehicle() { return new Carriage(); } @Override public Weapon createWeapon() { return new AK47(); } @Override public Food createFood() { return new SteamedBun(); } } class BusFactory implements AbstractFactory{ @Override public Vehicle createVehicle() { return new Bus(); } @Override public Weapon createWeapon() { return new AK47(); } @Override public Food createFood() { return new Apple(); } }
骑的交通工具
public interface Vehicle { void run(); } class Bus implements Vehicle{ @Override public void run() { System.out.println("bus 咚咚咚"); } } public class Carriage implements Vehicle { @Override public void run() { System.out.println("马车 撇撇撇"); } }
拿的武器
public interface Weapon { void shot(); } class AK47 implements Weapon{ @Override public void shot() { System.out.println("开Bus的手持ak47"); } } class Stick implements Weapon{ public void shot() { System.out.println("骑马的拿着铁棍!"); } }
吃的粮食
public interface Food { void eat(); } class Apple implements Food { @Override public void eat() { System.out.println("开bus的吃苹果"); } } class SteamedBun implements Food{ @Override public void eat() { System.out.println("骑马的吃馒头"); } }
客户端
public class Client { public static void main(String[] args) { AbstractFactory factory=new BusFactory(); Food f=factory.createFood(); Vehicle v=factory.createVehicle(); Weapon w=factory.createWeapon(); f.eat(); v.run(); w.shot(); } }
工厂方法与抽象工厂各有什么优缺点?
工厂方法一直都是围绕着产品这一个纬度,着重考虑怎么应对产品的变化。例如,新增一种类型的交通工具,并不要修改源码就能拓展成功,缺点就是工厂泛滥。
抽象工厂就是针对产品系列可拓展,例如新增某一种系列,人开着飞机去战斗,那么可以交通工具汽车,可以吃榴莲,手持导弹,可以轻松拓展进去。但是,弊端就是,系列工厂最开始要考虑周全,如果中途新增人还要有特定的服装,那就会非常麻烦。对于产品拓展不足。
标签:cto 指定 技术 run 创建者 开始 img factory string
原文地址:http://www.cnblogs.com/qiuyong/p/6918925.html