设计模式——工厂模式(Factory Pattern)

来源:互联网 发布:dotamax数据更新 编辑:程序博客网 时间:2024/05/21 05:59

工厂模式:

假如你是一家汽车公司的老板,为了满足世界各个国家的人的不同需要,在各个国家都创建了汽车生产工厂,每个工厂给该地区生产符合本地风格的汽车,那你的工厂和要生产的汽车是什么样的关系呢?让我们用工厂模式通过Java来描述一下。

为了方便起见,现只在3个国家建立工厂ChinaFactory,EnglishFactory和JapanFactory,中国需要生产中国风的汽车ChineseCar,英国有英国式的汽车EnglishCar,日本有日式的汽车JapaneseCar。虽然汽车的风格各异,但是这些汽车都有一般汽车通用的属性,如果另辟蹊径创建各种怪异的汽车成本太高不说还不一定有市场,所以这三中汽车都有一个共同的父类Car。当然汽车工厂也是在CarFactory工厂的基础之上改进而来。

据上所述,CarFactory与Car是其他汽车工厂与汽车的父类,这个工厂体系可以用父子类的方式构建,但是实际需要的是子类的实例,就是不同风格的汽车工厂与所生产的汽车,而不是父类的实例。CarFactory与Car更像是设计图或者规则,为子类设定好工厂生产方式与汽车的模型,而具体的实现要到实际中根据各的风格来决定,所以这个工厂体系可以用接口与类的方式或者抽象类与子类的方式构建,由于这里不需要用到成员变量就用接口与类的方式构建。

工厂模式的UML类图


为什么少了一个工厂呢?由于资金和国家批证等原因EnglishFactory没有预期建成(呵呵,随便找个理由)!等了好久终于所有的事情都弄好了,久终于可以在英国建工厂了。这时你会发现建立英国的工厂相当的容易,只需要用EnglishFactory与EnglishCar分别实现CarFactory和Car这两个接口,并用EnglishFactory关联EnglishCar就建立起你的工厂子类!

增加了EnglishFactory与EnglishCar的UML类图


工厂模式代码:

public interface Car {public void printName();}public class ChineseCar implements Car {public void printName() {System.out.println("ChineseCar");}}public class EnglishCar implements Car {public void printName() {System.out.println("EnglishCar");}}public class JapaneseCar implements Car {public void printName() {System.out.println("JapaneseCar");}}public interface CarFactory {        public Car getInstance();}public class ChinaFactory implements CarFactory {public Car getCarInstance() {return new ChineseCar();}}public class EnglishFactory implements CarFactory {public Car getCarInstance() {return new EnglishCar();}}public class JapanFactory implements CarFactory {public Car getCarInstance() {return new JapaneseCar();}}


Client测试类:

public class Client {public static void main(String[] args) {CarFactory cf ;Car car ;cf = new ChinaFactory();car = cf.getCarInstance();car.printName();cf = new EnglishFactory();car = cf.getCarInstance();car.printName();cf = new JapanFactory();car = cf.getCarInstance();car.printName();}}
运行结果:



工厂模式的使用场景:

1、客户端使用对象存在变动,或者不知道该创建什么对象。

2、客户端不用知道产品对象的创建过程

3、需要封装创建类对象的逻辑,使得这些逻辑局部化


工厂模式的优点/缺点:

优点:

1、增加新的产品很容易,只需实现产品接口和工厂接口

2、客户端不用知道产品对象的创建过程

3、支持开闭原则


缺点:

1、没有真正的避免修改源代码,当增加新产品时要么在客户端将工厂写死,要么将判断写在抽象工厂。使用配置文件可以解决这一问题。如spring

2、当产品越来越多时,工厂也会越来越多,出现类爆炸的情况。

3、只能产生某类产品,不能产生系列产品


0 0