一个new操作符产生一个对象实例;而new操作符又是用来构造对象实例的;
但用new操作符直接生成对象会带来一些问题???——》新对象的建立就是一个“过程”,不仅是一个操作;
- 【例子】假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用;
- 简单工厂模式:后来出现工业革命,用户不用去创建宝马车;因为客户有一个工厂来帮他创建宝马,他想要什么车,这个工厂就可以建;比如想要320i系列车,工厂就创建这个系列的车,即工厂可以创建产品。
- 工厂方法模式:为了满足客户,宝马车系列越来越多;如320i,523i,30li等系列一个工厂无法创建所有的宝马系列;于是由单独分出来多个具体的工厂,每个具体工厂创建一种系列;即具体工厂类只能创建一个具体产品,但是宝马工厂还是个抽象;你需要指定某个具体的工厂才能生产车出来;
- 抽象工厂模式:随着客户的要求越来越高,宝马车必须配置空调;于是这个工厂开始生产宝马车和需要的空调;
- 最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车了。而不用自己去创建523i空调车宝马车.
工厂模式???——》定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行;
- 工厂模式???——》
- 解决接口选择的问题;???——》创建对象时不对客户端暴露创建逻辑;???——》通过使用一个共同的接口来指向新创建的对象;
- 为创建对象提供过渡接口???——》将创建对象的具体过程屏蔽及隔离起来;???——》提高灵活性;
写了那么多,如何实现该模式呢?
工厂模式实现???——》建立一个工厂来创建对象;
既然知道了工厂模式是什么、如何实现;那么工厂模式有几种类型???——》
Simple Factory(简单工厂模式)
简单工厂模式的核心思想???——》有一个专门的类来负责创建实例的过程;???——》如何去实例化一个合适的对象;
简单工厂模式???——》
- 工厂角色(Creator)???——》核心;
- 抽象(Product)产品角色???——》简单工厂模式所创建的所有对象的父类;
- 注意:父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口;
- 具体产品(Concrete Product)角色???——》简单工厂所创建的具体实例对象;
那么应用于那呢???——》
- 工厂类负责创建的对象比较少;
- 客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
- 由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用;
Factory Method(工厂方法模式)
工厂方式模式???——》
- 一个抽象产品类,可以派生出多个具体产品类;
- 一个抽象工厂类,可以派生出多个具体工厂类;
- 每个具体工厂类只能创建一个具体产品类的实例;
AbstractFactory(抽象工厂)
抽象工厂???——》提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;
那么应用于那呢???——》
- 一个系统要独立于它的产品的创建、 组合和表示时;???——》创建接口;
- 一个系统要由多个产品系列中的一个来配置时;
- 当要强调一系列相关的产品对象的设计以便进行联合使用时;???——》创建一系列相关或相互依赖对象的接口;
- 当提供一个产品类库, 只想显示它们的接口而不是实现时;???——》创建接口;
一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式;
抽象工厂模式???——》
- 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类;
- 一个抽象工厂类,可以派生出多个具体工厂类;
- 每个具体工厂类可以创建多个具体产品类的实例;
那它有什么优缺点呢???——》
优点???——》当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象;
缺点???——》产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码;
注意:产品族难扩展,产品等级易扩展;
三种类型模式的关系???——》从上到下逐渐抽象,并具有一般性;
那么它们之间具有哪些区别???——》
- 工厂方法模式只有一个抽象产品类,而抽象工厂模式可以有多个;
- 工厂方法模式的具体工厂只能创建一个具有产品类的实例,而抽象工厂模式可以创建多个;
注意???——》
轻松方便地构造对象实例,不必关心构造对象实例的细节和复杂过程;
简单工厂模式
什么是简单工厂模式???——》建立一个工厂(一个函数或一个类方法)来制造新的对象;
分布说明引子???——》从无到有;???——》客户自己创建宝马车,然后拿来用;
public class BMW320 {
public BMW320(){
System.out.println("制造-->BMW320");
}
}
public class BMW523 {
public BMW523(){
System.out.println("制造-->BMW523");
}
}
public class Customer {
public static void main(String[] args) {
BMW320 bmw320 = new BMW320();
BMW523 bmw523 = new BMW523();
}
}
客户需要知道怎么去创建一款车,客户和车就紧密耦合在一起了;
为了降低耦合,就出现了工厂类???——》把创建宝马的操作细节都放到了工厂里面去,客户直接使用工厂的创建工厂方法,传入想要的宝马车型好就行了,而不必去知道创建的细节;
【例子】即我们建立一个工厂类方法来制造新的对象;如图:
产品类
abstract class BMW {
public BMW(){
}
}
public class BMW320 extends BMW {
public BMW320() {
System.out.println("制造-->BMW320");
}
}
public class BMW523 extends BMW{
public BMW523(){
System.out.println("制造-->BMW523");
}
}
工厂类:
public class Factory {
public BMW createBMW(int type) {
switch (type) {
case 320:
return new BMW320();
case 523:
return new BMW523();
default:
break;
}
return null;
}
}
客户类:
public class Customer {
public static void main(String[] args) {
Factory factory = new Factory();
BMW bmw320 = factory.createBMW(320);
BMW bmw523 = factory.createBMW(523);
}
}
工厂模式组成???——》
工厂类角色???——》核心???——》含有一定的商业逻辑和判断逻辑,用来创建产品;
抽象产品角色???——》具体产品继承的父类、实现的接口;
具体产品角色???——》工厂类所创建的对象;
从开闭原则(扩展开放;修改封闭)上来分析下简单工厂模式;
【例子】当客户不再满足现有的车型号的时候,想要一种速度快的新型车,只要这种车符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了;
解析:
- 相对于产品部分???——》符合开闭原则;
- 相对于工厂部分???——》违背开闭原则;???——因为每增加一种新型车,都要在工厂类中增加相应的创建业务逻辑(createBMW(int type)方法需要新增case);
工厂类是被动的;???——》称它为全能类或者上帝类;???——》但简单工厂模式中只有一个工厂类来对应这些产品;
工厂类???——》定义成了接口;???——》而每新增的车种类型,就增加该车种类型对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码;
工厂方法模式???——》
- 工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承;
- 这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担;