简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method)模式。
简单工厂模式就是由一个工厂类根据传入的参数决定创建哪一种的产品类。
有4个角色
工厂类角色:是具体产品类角色直接调用者。
抽象产品角色:接口或抽象类,负责具体产品角色的定义,及与客户端的交互。
具体产品角色:被工厂类创建的对象,也是客户端实际操作对象。
客户端:调用工厂类产生实例,并调用实例的方法进行相应工作。
public interface people{
public void say();
}
public class chinese implements people{
public void say(){
System.out.println("说中国话");
}
}
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();
}
}
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。
首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式的对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
工厂方法模式(Factory Method pattern)是最典型的模板方法模式(Templete Method pattern)应用。
如图:
基于面向接口编程的原理,创建部分成为抽象工厂与实体工厂,创建出的对象成为抽象产品与实体产品。你可能知道为什么它能解决上面的问题了:多了一个新对象,只需添加一套对应的工厂和产品就可以了,不需要修改原代码,或只需进行少量的修改。
具体:
实体工厂实现抽象工厂,实体产品实现抽象产品;抽象工厂生产抽象产品,实体工厂生产实体产品;实体工厂A生产实体产品A,实体工厂B生产实体产品B。
public interface Icar{
public void docar();
}
public class bwm implements Icar{
public void docar(){
System.out.println("我是宝马,别摸我");
}
}
public class buick implements Icar{
public void docar(){
System.out.println("我是别克,很酷");
}
}
public interface Icarfactory{
public Icar createCar();
}
public class bmwFactory implements Icarfactory{
public Icar createCar(){
return new bwm();
}
}
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();
}
}
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据LSP原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
简介
当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品角色都有两个具体产品。抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。
每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结果。