(二) 工厂模式详解

简单工厂模式

从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory
Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现

以下为UML图 :
简单工厂模式

可以看出,上面总共有三种类,一个是工厂类Creator,一个是产品接口IProduct,一个便是具体的产品,例如产品A和产品B,这之中,工厂类负责整个创建产品的逻辑判断,所以为了使工厂类能够知道我们需要哪一种产品,我们需要在创建产品时传递给工厂类一个参数,去表明我们想要创建哪种产品。

产品接口 :

public interface Fruits {
	// 一种抽象产品共用的方法
    void taste();
}

具体产品 :

public class Apple implements Fruits {
    @Override
    public void taste() {
        System.out.println("苹果是甜的");
    }
}
public class Orange implements Fruits {
    @Override
    public void taste() {
        System.out.println("橘子是酸的");
    }
}

简单产品工厂 :

public class FruitsFactory {

    private FruitsFactory(){}
	// 根据 name 创建特定的具体产品
    public static Fruits creator(String name) {
        Fruits fruits = null;
        switch (name){
           case "apple":fruits = new Apple();
           break;
           case "orange":fruits = new Orange();
           break;
        }
        return fruits;
    }
}

以上就是简单工厂模式具体实现。实现过程 简单、粗暴,但是一旦新增具体产品 比如香蕉 那么我们需要增加一个 香蕉接口(新增拓展) 同时修改 工厂类FruitsFactory
的switch分支(修改) 这样违背了 开-闭原则 故此工厂方法模式应运而生


工厂方法模式 :

定义:工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

大概意思就是 我们把工厂抽象出来定义一个工厂接口,而具体的创建工作推迟到具体的工厂类。它是对简单工厂模式中的工厂类进一步抽象化,从而产生一个工厂类的抽象和实现体系,从而弥补简单工厂模式对修改开放的诟病。

以下为UML图 :
工厂方法uml图

Ctreator 为抽象工厂 定义一个返回抽象产品的接口方法,每种具体的产品都有属于自己的产品创造工厂 代码如下。

抽象工厂 :

// 抽象工厂
public interface AbstractFactory {
	// 定义返回抽象产品方法
    Fruits creator();
}

抽象产品 :

public interface Fruits {
    void taste();
}

真实产品类 :

public class Apple implements Fruits {
    @Override
    public void taste() {
        System.out.println("苹果是甜的");
    }
}

public class Orange implements Fruits {
    @Override
    public void taste() {
        System.out.println("橘子是酸的");
    }
}

具体产品工厂类 :

public class AppleFactory implements AbstractFactory {
    @Override
    public Fruits creator() {
        return new Apple();
    }
}

public class OrangeFactor implements AbstractFactory {
    @Override
    public Fruits creator() {
        return new Orange();
    }
}

测试类 :

public  class FactoryTest {
    public static void main(String[] args) {
        AbstractFactory a = new AppleFactory();
        Fruits creator = a.creator();
        creator.taste();
    }
}

当我们需要增加新的具体产品时 只需要增加相应的产品类、产品工厂类即可。这样就保证了 开-闭原则 不再被破坏。
上面例子中产品都是水果,有的时候我们也需要增加另外一些抽象产品。笨拙的方法是
照葫芦画瓢,对新增的抽象产品依次创建抽象产品、抽象工厂、产品、产品工厂。当抽象产品越来越多时,我们的类维护起来就有些麻烦了,如此抽象工厂模式应运而生。


抽象工厂模式 :

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类

抽象工厂模式算是工厂相关模式的终极形态,它与上面的工厂方法唯一的区别就是工厂的接口里是一系列创造抽象产品的方法,而不再是一个,而相应的,抽象产品也不再是一个了,而是一系列相关的产品。

以下为UML图 :
抽象工厂模式UML图

抽象工厂 :

// 抽象工厂 返回多种抽象产品
public interface AbstractFactory {
	
    Fruits creatorFruits();

    Animal creatorAnimals();
}

抽象产品 :

public interface Fruits {

    void taste();
}

public interface Animal {

    void eat();

}

具体产品 :

public class Apple implements Fruits {
    @Override
    public void taste() {
        System.out.println("苹果是甜的");
    }
}

public class Orange implements Fruits {
    @Override
    public void taste() {
        System.out.println("橘子是酸的");
    }
}

public class Cat implements Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

public class Dog implements Animal {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
}

真实工厂 :

public class FactoryA implements AbstractFactory {

    @Override
    public Fruits creatorFruits() {
        return new Apple();
    }
    
    @Override
    public Animal creatorAnimals() {
        return new Cat();
    }
}

public class FactoryB implements AbstractFactory {

    @Override
    public Fruits creatorFruits() {
        return new Orange();
    }
    
    @Override
    public Animal creatorAnimals() {
        return new Dog();
    }
}

测试代码 :

public  class FactoryTest {

    public static void main(String[] args) {
        AbstractFactory a = new FactoryA();
        Animal animal = a.creatorAnimals();
        Fruits fruits = a.creatorFruits();
        animal.eat();
        fruits.taste();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值