概述
打个比方,你现在要得到两辆车BMW和Tesla,
你可以 new BMW() new Tesla()
然而造车可能没有这么简单,你可能new了两个车壳子,可能还需要各种零件,
除非你愿意也不怕麻烦,可以自己实现。
(静态/简单)工厂模式,就是工厂内预设了车型的生产线,你可以
factory.get(“BMW”) factory.get(“Tesla”)
也可以
factory.getBMW() factory.getTesla()
你只管提车,不需要管创建过程。
但是有个问题,如果你要一台Audi,工厂并没有这个生产线,那么你必须修改工厂,这就违背了开闭原则。
工厂方法模式
在一种车辆建造标准(car interface)下建造各自的工厂(实现car interface)
提车,BMWfactory.get() ,Teslafactory.get()
新车型SaiEn出来了建造新的工厂
Class SaiEnfactory implement car 容易扩展,避免修改。
到这里,你可以直接看实例了,下面的废话看了实例再回来理解 ,也可以不看
属于创建型模式
创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。实现创建者和调用者分离
**意图:**定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
**主要解决:**主要解决接口选择的问题。
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
**缺点:**每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
代码样例
简单工厂
public class simpleFactory {
interface car{
void showMessage();
}
static class BMW implements car {
@Override
public void showMessage() {
System.out.println("build BMW");
}
}
static class Tesla implements car {
@Override
public void showMessage() {
System.out.println("build Tesla");
}
}
static class carFactory{
public car getBMW() {
return new BMW();
}
public car getTesla() {
return new Tesla();
}
}
public static void main(String[] args) {
carFactory carFactory=new carFactory();
carFactory.getBMW();
carFactory.getTesla();
}
}
一般不应该写成内部类,仅展示
工厂方法
public class factoryMethod {
interface car{
void showMessage();
}
static class BMW implements car{
@Override
public void showMessage() {
System.out.println("build BMW");
}
}
static class Tesla implements car {
@Override
public void showMessage() {
System.out.println("build Tesla");
}
}
interface factory{
Tesla getcar();
}
static class BMWfactoy implements factory {
@Override
public Tesla getcar() {
return new BMW();
}
}
static class Teslafactoy implements factory {
@Override
public Tesla getcar() {
return new Tesla();
}
}
public static void main(String[] args) {
new Teslafactoy().getcar();
new BMWfactoy().getcar();
}
}