-
简单的工厂模式
添加时间:2013-8-10 点击量:从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂办法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决意创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以懂得为是不合工厂模式的一个特别实现。
实现体式格式(附图)
简单工厂模式的UML类图
简单工厂模式的本质是由一个工厂类按照传入的参数,动态决意应当创建哪一个产品类(这些产品类持续自一个父类或接口)的实例。
该模式中包含的角色及其职责
工厂(Factory)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
抽象产品(Car)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(BMW)角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
长处
工厂类是全部模式的关键.包含了须要的逻辑断定,按照外界给定的信息,决意毕竟应当创建哪个具体类的对象.经由过程应用工厂类,外界可以从直接创建具体产品对象的难堪场合排场摆脱出来,仅仅须要负责“花费”对象就可以了。而不必管这些对象毕竟如何创建及如何组织的.明白了各自的职责和权力,有利于全部软件体系布局的优化。
毛病
因为工厂类集中了所有实例的创建逻辑,违背了高内聚义务分派原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先推敲到的,若是须要添加新的类,则就须要改变工厂类了。
当体系中的具体产品类络续增多时辰,可能会呈现请求工厂类按照不合前提创建不合实例的需求.这种对前提的断定和对具体产品类型的判决绝错在一路,很难避免模块功能的伸展,对体系的保护和扩大很是晦气;
这些毛病在工厂办法模式中获得了必然的降服。
应用重视向
工厂类负责创建的对象斗劲少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关怀;
因为简单工厂很轻易违背高内聚义务分派原则,是以一般只在很简单的景象下应用。
代码如下:
1 package xiao.li;
2
3 public class 简单工厂
4 {
5 public static void main(String[] agrs)
6 {
7 CarFactory cf = new CarFactory();//工厂
8 Car c=null;
9 // c = cf.getCar(飞机); 既然是汽车工厂,怎么可能能帮您临盆飞机
10 c=cf.getCar(BMW);
11 if(c!=null)
12 {
13 c=new BMW();//实体对象
14 System.out.println(您好,你的宝马我们已经帮您临盆好了,请你有空前来提货并付款!);
15 }else
16 {
17 System.out.println(不好意思,恕我力所不及!);
18 }
19
20 }
21 }
22 /
23 汽车工厂类
24 /
25 class CarFactory
26 {
27 /
28 临盆汽车办法
29 /
30 public static Car getCar(String type)
31 {
32 Car c =null;
33 if(BMW.equals(type)) //断定顾客是须要那样的汽车
34 {
35 c=new BMW(); //临盆宝马汽车
36 }else if(Benz.equals(type))
37 {
38 c=new Benz(); //临盆奔驰
39 }
40 return c;
41 }
42 }
43 /
44 汽车的接口类
45 /
46 abstract class Car
47 {
48 /
49 开车
50 /
51 public abstract void run();
52 /
53 泊车
54 /
55 public abstract void stop();
56 }
57 /
58 奔驰
59 /
60 class Benz extends Car
61 {
62
63 public void run() {
64 // TODO Auto-generated method stub
65 System.out.println(奔驰行驶中);
66 }
67
68 public void stop() {
69 // TODO Auto-generated method stub
70 System.out.println(奔驰泊车了);
71 }
72 }
73 /
74 宝马
75 /
76 class BMW extends Car
77 {
78
79 @Override
80 public void run() {
81 // TODO Auto-generated method stub
82 System.out.println(宝马行驶中);
83 }
84
85 @Override
86 public void stop() {
87 // TODO Auto-generated method stub
88 System.out.println(宝马泊车了);
89 }
90 }