简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method)模式。
简单工厂模式就是由一个工厂类根据传入的参数决定创建哪一种的产品类。
有4个角色
工厂类角色:是具体产品类角色直接调用者。
抽象产品角色:接口或抽象类,负责具体产品角色的定义,及与客户端的交互。
具体产品角色:被工厂类创建的对象,也是客户端实际操作对象。
客户端:调用工厂类产生实例,并调用实例的方法进行相应工作。
示例代码:
抽象产品角色:
public interface people{
public void say();
}
具体产品角色1
public class chinese implements people{
public void say(){
System.out.println("说中国话");
}
}
具体产品角色2
public class american implements people{
public void say(){
System.out.println("speak english");
}
}
工厂类角色
public class peopleFactory{
public static people create(int type){
if(type==1){
return new chinese();
}else if(type==2){
return new american();
}
}
}
客户端
public class test{
public static void main(String []args){
people p=peopleFactory.create(1);
p.say();
p=peopleFactory.create(2);
p.say();
}
}
工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类
抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类
个人觉得这个区别在于产品,如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。再通俗深化理解下:工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。
再来看看工厂方法模式与抽象工厂模式对比:
工厂方法模式 | 抽象工厂模式 |
针对的是一个产品等级结构 | 针对的是面向多个产品等级结构 |
一个抽象产品类 | 多个抽象产品类 |
可以派生出多个具体产品类 | 每个抽象产品类可以派生出多个具体产品类 |
一个抽象工厂类,可以派生出多个具体工厂类 | 一个抽象工厂类,可以派生出多个具体工厂类 |
每个具体工厂类只能创建一个具体产品类的实例 | 每个具体工厂类可以创建多个具体产品类的实例 |
工厂方法模式示例代码:
一个抽象产品类
public interface Icar{
public void docar();
}
具体产品类1
public class bwm implements Icar{
public void docar(){
System.out.println("我是宝马,别摸我");
}
}
具体产品类2
public class buick implements Icar{
public void docar(){
System.out.println("我是别克,很酷");
}
}
一个抽象工厂类
public interface Icarfactory{
public Icar createCar();
}
具体工厂类1
public class bmwFactory implements Icarfactory{
public Icar createCar(){
return new bwm();
}
}
具体工厂类2
public class buickFactory implements Icarfactory{
public Icar createCar(){
return new buick();
}
}
客户端
public class test{
public static void main(String []args){
Icarfactory factory=new bmwFactory();
Icar bwm= factory.createCar();
bwm.docar();
factory=new buickFactory();
Icar buick= factory.createCar();
buick.docar();
}
}
抽象工厂示例代码:
抽象工厂
public interface Gardener {
}
public Fruit createFruit(String name) {
return new TropicalFruit(name);
}
return new TropicalVeggie(name);
}
}
public Fruit createFruit(String name) {
return new NorthernFruit(name);
}
return new NorthernVeggie(name);
}
}
}
private String name;
System.out.println("热带工厂为您创建了:热带水果-"+name);
}
return name;
}
this.name = name;
}
private String name;
System.out.println("亚热带工厂为您创建了:亚热带水果-"+name);
}
return name;
}
this.name = name;
}
}
private String name;
System.out.println("热带工厂为您创建了:热带水果-"+name);
}
return name;
}
this.name = name;
}
private String name;
System.out.println("亚热带工厂为您创建了:亚热带蔬菜-"+name);
}
return name;
}
this.name = name;
}
private void test(){
Veggie tv,nv;
Fruit tf,nf;
TropicalGardener tg=new TropicalGardener();
NorthernGardener ng=new NorthernGardener();
nv=ng.createVeggie("东北甜菜");
tf=tg.createFruit("海南椰子");
nf=ng.createFruit("雪梨");
}
public static void main(String args[]){
TestApp test=new TestApp();
test.test();
}
}