工厂模式(Factory Pattern)
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
一、简单工厂&静态工厂
1、简单工厂
package com.lcl.galaxy.design.pattern.factory; public class AnimalFactory { public static Animal CreateAnimal(String name){ if ("dog".equals(name)){ return new Dog(); }else if("cat".equals(name)){ return new Cat(); } return null; } }
调用
@Test public void factoryTest(){ Animal animal = AnimalFactory.CreateAnimal("cat"); animal.eat(); }
2、静态工厂
public abstract class StaticAnimalFactory { public abstract Animal createAnimal(); }
public class CatFactory extends StaticAnimalFactory { @Override public Animal createAnimal() { return new Cat(); } }
public class DogFactory extends StaticAnimalFactory { @Override public Animal createAnimal() { return new Dog(); } }
调用
@Test public void factoryTest1(){ StaticAnimalFactory factory = new CatFactory(); Animal animal = factory.createAnimal(); animal.eat(); }
优点:可以通过一个类进行创建所有内容,简单、易懂
缺点:1、所有创建对象都放到了一个类中,如果需要创建的对象很多,该类就会很庞大
2、违反了开闭设计原则,如果新增一个对象,就需要调整工厂类
二、抽象工厂模式
抽象工厂模式主要就是将一个维度的内容抽成一个工厂,例如,一个接口可以生产衣服,一个接口可以生产鞋子,那么总的工厂就可以提供两个方法,分别去生产衣服和鞋子;那么A品牌的工厂就可以实现/继承总工厂,并创建自己的对象。
下面以书桌和书架为例,
书桌超类为Desk,那么木制书桌为WoodDesk,铁质书桌为IronDesk;
书架超类为Shelf,木制书架为WoodDesk,铁质书架为IronDesk;
同时创建一个工厂抽象类,提供了创建书桌和书架的方法,
木制工厂实现/继承该类,创建的书桌为木制书桌,创建的书架为木制书架
铁制工厂实现/继承该类,创建的书桌为铁制书桌,创建的书架为铁制书架
public abstract class ProductionFactory { public abstract Desk createDesk(); public abstract Shelf createShelf(); }
public class IronFactory extends ProductionFactory { @Override public Desk createDesk() { return new IronDesk(); } @Override public Shelf createShelf() { return new IronShelf(); } }
public class WoodFactory extends ProductionFactory { @Override public Desk createDesk() { return new WoodDesk(); } @Override public Shelf createShelf() { return new WoodShelf(); } }
测试
@Test public void factoryTest3(){ ProductionFactory productionFactory = new IronFactory(); Desk desk = productionFactory.createDesk(); desk.printDesk(); Shelf shelf = productionFactory.createShelf(); shelf.printShelf(); }
最后是三种方式的对比
模式 | 优缺点 |
简单工厂 | 使用一个工厂对象用来生产同一等级结构中的任意产品;不支持拓展增加产品 |
工厂方法 | 使用多个工厂对象用来生产同一等级结构中对应的固定产品,支持拓展增加产品 |
抽象工厂 | 使用多个工厂对象用来生产不同产品组的产品,不支持拓展产品,支持拓展产品组 |
------------------------------------------------------------------
-----------------------------------------------------------
---------------------------------------------
朦胧的夜 留笔~~
-----------------------------------------------------------
---------------------------------------------
朦胧的夜 留笔~~