工厂模式包含多种形态,每种形态对应的实际情况不同,具体为以下三类:
简单工厂模式 simple factory
工厂方法模式 Factory method
抽象工厂模式 abstract factory
使用工厂模式的目的在于:
对象的实例化从客户端代码中转移到非客户端代码中 -- 也就是实现
客户端和业务端的解耦
如果以 public static void main 看做是 客户端代码,那么 工厂类的模式就表示,在 main方法中,如果你要使用类A或者类B,那么在main方法中看不到 new A()或者 new B()等代码,而是在创建这些类的工厂类中才可以看到。
简单
工厂模式(simple factory) 属于类创建模式,又叫做静态工厂模式(static factory)。
使用简单工厂模式,在实际的环境中,一般有四个参与者(角色),分别:
工厂类角色:直接产品角色的调用者
抽象产品角色:接口或抽象类,负责具体产品角色的定义,及与客户端的交互。
具体产品角色:被工厂类创建的对象,也是客户端实际操作对象
客户端:调用工厂类产生实例,并调用实例的方法进行相应工作
包含例子如下:
package com.yp;
/**
* 定义 People 抽象类
* @author Administrator
*/
public abstract class People{
abstract void say();
}
package com.yp;
public class Chinese extends People {
void say() {
System.out.println("说汉语");
}
}
package com.yp;
public class American extends People {
void say() {
System.out.println("Speak in English");
}
}
package com.yp;
public class PeopleFactory {
public static People create(int type) {
People p = null;
if (1 == type) {
p = new Chinese();
} else if (2 == type) {
p = new American();
}
return p;
}
}
最后的测试类,也就客户端代码:
package com.yp;
public class t {
public static void main(String[] args) {
People p = PeopleFactory.create(1);
People p2 = PeopleFactory.create(2);
p.say();
p2.say();
}
}
执行结果如下:
分析:
在此模式下,客户端的角色,只能看到工厂类角色和产品抽象角色,而对产品实现角色是看不到的。
此模式的缺点:
如果在客户端中需要新的类,拿以上的例子来说,加入要增加英国人,法国人,那么除了新增实际的类来继承People之外,工厂类也必须要调整,因为工厂类目前负责匹配前台传入值和实际的类的映射关系。
转载于:https://my.oschina.net/u/1182369/blog/406567