Java学习笔记整理: 关于设计模式:工厂模式 2024/7/10;

工厂模式

自理解:通过指定的一系列工厂化操作进行new对象,从而便捷实现多层继承|实现关系之间创建对象;

创建型模式
工厂模式的目的:

将创建对象的具体过程屏蔽隔离起来,从而达到更高的灵活性,

工厂模式可以分为三类:

简单工厂模式(Simple Factory)

自理解:把需要实现的功能抽取为一个接口,使用时通过实现该接口以获取该接口下的统一方法并由工厂类进行new对象;

简单工厂模式的核心是定义一个创建对象的接口,将对象的创建和本身的业务逻辑分离,降低系统的耦合度,使得两个修改起来相对容易些,当以后实现改变时,只需要修改工厂类即可

简单工厂模式的优缺点:

简单工厂模式提供专门的工厂类用于创建对象,实现了对象创建和使用的职责分离,客户端不需知道所创建的具体产品类的类名以及创建过程,只需知道具体产品类所对应的参数即可,通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

但缺点在于不符合“开闭原则”,每次添加新产品就需要修改工厂类。在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展维护,并且工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。 
​
为了解决简单工厂模式的问题,出现了工厂方法模式。 
实例:::
//创建简单工厂类;
public class Factory {
    public BMW createBMW(int type) {
        switch (type) {
​
        case 320:
            return new BMW320();
​
        case 523:
            return new BMW523();
​
        default:
            break;
        }
        return null;
    }
}
//创建main方法使用简单工厂类声明对象;
public class Customer {
    public static void main(String[] args) {
        Factory factory = new Factory();
        BMW bmw320 = factory.createBMW(320);
        BMW bmw523 = factory.createBMW(523);
    }
}

工厂方法模式(Factory Method)

自理解:由一个工厂类(总类)和创建一个对应的工厂类(类中之一)共同new对象(每增加一个类需要创建两个类(一个工厂类一个细节类));

增加了简单工厂没有的可扩展性(符合开闭原则的),但同时也更加复杂;

工厂方法模式将工厂抽象化,并定义一个创建对象的接口。每增加新产品,只需增加该产品以及对应的具体实现工厂类,由具体工厂类决定要实例化的产品是哪个,将对象的创建与实例化延迟到子类,这样工厂的设计就符合“开闭原则”了,扩展时不必去修改原来的代码。在使用时,用于只需知道产品对应的具体工厂,关注具体的创建过程,甚至不需要知道具体产品类的类名,当我们选择哪个具体工厂时,就已经决定了实际创建的产品是哪个了。

实例:::
//产品类:------------------------------------------------
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");
    }
}
//工厂类:------------------------------------------------
//汽车总厂
interface FactoryBMW {
    BMW createBMW();
}
//汽车工厂1
public class FactoryBMW320 implements FactoryBMW{
​
    @Override
    public BMW320 createBMW() {
        return new BMW320();
    }
​
}
//汽车工厂2
public class FactoryBMW523 implements FactoryBMW {
    @Override
    public BMW523 createBMW() {
        return new BMW523();
    }
}
//客户类:------------------------------------------------
public class Customer {
    public static void main(String[] args) {
        //首先new该产品工厂
        FactoryBMW320 factoryBMW320 = new FactoryBMW320();
        //然后通过工厂获取车
        BMW320 bmw320 = factoryBMW320.createBMW();
​
        //也可以这样直接获取车对象
        BMW523 bmw523 = new FactoryBMW523().createBMW();
    }
}

抽象工厂模式(Abstract Factory)

在工厂方法模式中,我们使用一个工厂创建一个产品,一个具体工厂对应一个具体产品,但有时候我们需要一个工厂能够提供多个产品对象,而不是单一的对象,这个时候我们就需要使用抽象工厂模式。

概念

  • 产品等级结构:产品等级结构指的是产品的继承结构,例如一个空调抽象类,它有海尔空调、格力空调、美的空调等一系列的子类,那么这个空调抽象类和他的子类就构成了一个产品等级结构。

  • 产品族:产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。比如,海尔工厂生产海尔空调、海尔冰箱,那么海尔空调则位于海尔族中。

什么是抽象工厂模式

抽象工厂模式主要用于创建相关对象的家族。当一个产品族中需要被设计在一起工作时,通过抽象工厂模式,能够保证客户端始终只使用同一个产品族中的对象;并且通过隔离具体类的生成,使得客户端不需要明确指定具体生成类;所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

但该模式的缺点在于添加新的行为时比较麻烦,如果需要添加一个新产品族对象时,需要更改接口及其下所有子类,这必然会带来很大的麻烦。

  • 抽象工厂 AbstractFactory:定义了一个接口,这个接口包含了一组方法用来生产产品,所有的具体工厂都必须实现此接口。

  • 具体工厂 ConcreteFactory:用于生产不同产品族,要创建一个产品,用户只需使用其中一个工厂进行获取,完全不需要实例化任何产品对象。

  • 抽象产品 AbstractProduct:这是一个产品家族,每一个具体工厂都能够生产一整组产品。

  • 具体产品 Product

  • 实例:::

  • 产品类:
    //发动机以及型号  
    public interface Engine {}  
    ​
    public class EngineA implements Engine{  
        public EngineA(){  
            System.out.println("制造-->EngineA");  
        }  
    }  
    public class EngineB implements Engine{  
        public EngineB(){  
            System.out.println("制造-->EngineB");  
        }  
    }  
//空调以及型号  
public interface Aircondition {} 
​
public class AirconditionA implements Aircondition{  
    public AirconditionA(){  
        System.out.println("制造-->AirconditionA");  
    }  
}  
public class AirconditionB implements Aircondition{  
    public AirconditionB(){  
        System.out.println("制造-->AirconditionB");  
    }  
} 
```
​
####  创建工厂类: 
​
```java
//创建工厂的接口  
public interface AbstractFactory {  
    //制造发动机
    public Engine createEngine();
    //制造空调 
    public Aircondition createAircondition(); 
}  
​
//为宝马320系列生产配件  
public class FactoryBMW320 implements AbstractFactory{     
    @Override  
    public Engine createEngine() {    
        return new EngineA();  
    }  
    @Override  
    public Aircondition createAircondition() {  
        return new AirconditionA();  
    }  
}  
//宝马523系列
public class FactoryBMW523 implements AbstractFactory {  
     @Override  
    public Engine createEngine() {    
        return new EngineB();  
    }  
    @Override  
    public Aircondition createAircondition() {  
        return new AirconditionB();  
    }  
} 
```
​
####  客户: 
​
```java
public class Customer {  
    public static void main(String[] args){  
        //生产宝马320系列配件
        FactoryBMW320 factoryBMW320 = new FactoryBMW320();  
        factoryBMW320.createEngine();
        factoryBMW320.createAircondition();
​
        //生产宝马523系列配件  
        FactoryBMW523 factoryBMW523 = new FactoryBMW523();  
        factoryBMW523.createEngine();
        factoryBMW523.createAircondition();
    }  
}
```
​
工厂模式小结:
​
1、工厂方法模式与抽象工厂模式的区别在于:
​
(1)工厂方法只有一个抽象产品类和一个抽象工厂类,但可以派生出多个具体产品类和具体工厂类,每个具体工厂类只能创建一个具体产品类的实例。
​
(2)抽象工厂模式拥有多个抽象产品类(产品族)和一个抽象工厂类,每个抽象产品类可以派生出多个具体产品类;抽象工厂类也可以派生出多个具体工厂类,同时每个具体工厂类可以创建多个具体产品类的实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值