一 什么是工厂模式?工厂模式的特点是什么?
工厂模式是Java中最常用的设计模式之一,它属于创建型模式,是常用的实例化对象模式。在工厂模式中,在创建对象时不会暴露创建逻辑。
特点:
二 工厂模式的几种实现方法
1.简单工厂模式
public class AnimalFactory {//简单工厂设计模式(负担太重、不符合开闭原则)public static Animal createAnimal(String name) {if ("cat".equals(name)) {return new Cat();} else if ("dog".equals(name)) {return new Dog();} else if ("cow".equals(name)) {return new Cow();} else {return null;}}}
优点:把所有对象都放在一起,实现起来很简单,很容易学会。
缺点:扩展性差,添加一个新的对象,都要重新修改代码,违背了开闭原则(对拓展开发,对修改关闭)
2.工厂方法模式
简单介绍一下:创建一个工厂接口,让每一种动物创建自己的工厂类
public interface AnimalFactory {public Animal createAnimal();}
public class CatFactory implements AnimalFactory {@Overridepublic Animal createAnimal() {return new Cat();}}
public class CowFactory implements AnimalFactory {@Overridepublic Animal createAnimal() {return new Cow();}}
public class DogFactory implements AnimalFactory {@Overridepublic Animal createAnimal() {return new Dog();}}
优点:这种方式很好的减轻了工厂类的负担,增加新的对象,不需要修改工厂类,符合开闭原则。
缺点:增加了类的数量,当有几十种类型的产品时,就有几十对应的工厂类,不便于管理。
3.抽象工厂模式
比如说两家公司都生产手机和路由器,如果都按照上面的方法,将创建很多类,我们将把他们的业务类整合在一起,所以我们使用抽象工厂模式
先创建电话和路由器的接口
//这是手机 public interface IProducterPhone { //这里就不写具体代码了 }
//这是手机public interface IProducterPhone {//这里就不写具体代码了}
//这是路由器 public interface IProducterRouter { }
//这是路由器public interface IProducterRouter {}
接下来创建两家公司的产品
public class HuaweiPhone implements IProducterPhone{ }
public class HuaweiPhone implements IProducterPhone{}
public class HuaweiRouter implements IProducterRouter{ }
public class HuaweiRouter implements IProducterRouter{}
public class XiaomiPhone implements IProducterPhone{ }
public class XiaomiPhone implements IProducterPhone{}
public class XiaomiRouter implements IProducterRouter{ }
public interface AnimalFactory {public Animal createAnimal();}
0
继续创建工厂接口
public interface AnimalFactory {public Animal createAnimal();}
1
最后是两家公司的实现工厂类
public interface AnimalFactory {public Animal createAnimal();}
2
public interface AnimalFactory {public Animal createAnimal();}
3
从此可以看出这种方式,整合业务,使类少了,业务关系更清晰,缺点是扩展性不好。
三 哪些场景使用了工厂模式
下面只是简单的举例说明,不局限在以下几种场景:
最后,要根据其特点和需求,合理使用此模式。毕竟合适的才是最好的。
下一篇:卡萨帝冰箱633