摘要: 工厂模式也是创建型模式中的一中、而工厂模式具体有三种即简单工厂模式(静态工厂模式)、工厂方法模式、抽象工厂模式。
一、简单工厂模式
简单工厂模式又称为静态工厂模式,实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例;将对象创建过程交给工厂方法来执行……
1、UML类图
2、角色
工厂类、抽象产品类、抽象产品实现类; 这里的抽象产品类是工厂要生成的产品类的抽象,工厂可以生成这一类型的产品。
3、使用场景
其实简单工厂模式在项目中使用的比较多,只要产品类实现了同一个产品抽象类而且按照不同的参数或业务需求需要不同的类则可以使用简单工厂模式,比如在之前的策略模式在项目中使用的时候一定会和工厂模式一起使用或者更直接的说是和简单工厂模式一起使用。
4、实例
(1)、抽象产品类
public interface Mouse {
void desc();
}
(2)、抽象产品实现类
public class AppleMouse implements Mouse {
@Override
public void desc() {
System.out.println("功能强大、好用、略贵……");
}
}
public class LogitechMouse implements Mouse {
@Override
public void desc() {
System.out.println("各个价位都有、选择丰富……");
}
}
(3)、产品分类标识
public enum MouseEnum {
/**
* APPLE
*/
APPLE(0, "苹果鼠标", "功能强大、价格略贵、好用"),
/**
* 罗技
*/
LOGITECH(1, "罗技鼠标", "选择丰富、好用"),;
@Getter
private Integer code;
@Getter
private String name;
@Getter
private String desc;
MouseEnum(Integer code, String name, String desc) {
this.code = code;
this.name = name;
this.desc = desc;
}
}
(4)、简单工厂类
public class MouseFactory {
/**
* 工厂方法创建对象
*
* @param mouseEnum
* @return
*/
public static Mouse create(MouseEnum mouseEnum) {
Mouse mouse;
switch (mouseEnum) {
case APPLE:
mouse = new AppleMouse();
break;
case LOGITECH:
mouse = new LogitechMouse();
break;
default:
mouse = null;
break;
}
return mouse;
}
}
5、不足
一个工厂类、对象的创建都是在这个工厂方法中,如果要新增一种对象则需要改变工厂方法、按照最简单的来说就是需要改变工厂方法,添加if else 。这样的操作破坏了代码的开闭原则,所以就有了下面的工厂方法。
二、工厂方法模式
定义一个抽象工厂,而每一种产品工厂实现这个抽象工厂来生产自己的产品即每一个实现类生产产品类中的一种产品。这样解决了上面修改原有代码的问题。
1、UML类图
2、角色
抽象工厂类、工厂实现类、抽象产品类、抽象产品实现类;
3、相比简单工厂的变化
优点:开闭原则、如果添加抽象产品类的实现类则实现工厂接口、抽象产品接口,通过扩展就能满足。
缺点:客户需要知道具体工厂,选择具体工厂来实现具体对象创建。
4、实例
(1)、抽象产品类
public interface Mouse {
void desc();
}
(2)、抽象产品实现类
public class AppleMouse implements Mouse {
@Override
public void desc() {
System.out.println("功能强大、好用、略贵……");
}
}
public class LogitechMouse implements Mouse {
@Override
public void desc() {
System.out.println("各个价位都有、选择丰富……");
}
}
(3)、抽象工厂
public interface IMouseFactory {
/**
* 抽象工厂方法
*
* @return
*/
Mouse create();
}
(4)、工厂实现类
public class AppleMouseFactory implements IMouseFactory {
@Override
public Mouse create() {
return new AppleMouse();
}
}
public class LogitechMouseFactory implements IMouseFactory {
@Override
public Mouse create() {
return new LogitechMouse();
}
}
(5)、测试
//apple 工厂、产品类
IMouseFactory appleFactory = new AppleMouseFactory();
Mouse appleMouse = appleFactory.create();
appleMouse.desc();
// logitech 工厂、产品类
IMouseFactory logitechFactory = new LogitechMouseFactory();
Mouse logitechMouse = logitechFactory.create();
logitechMouse.desc();
三、抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列。
个人理解: 抽象工厂模式是用来生产多种产品类的,而简单工厂模式、工厂方法模式是用来生产单个产品的多种类型。
1、UML类图
2、角色
抽象工厂类、抽象工厂实现类、抽象产品类(可以是多种类型)、抽象产品实现类
抽象工厂类(工厂中有多个类型生产的抽象方法)、抽象工厂实现类、抽象产品族、抽象产品族实现类
3、简单工厂模式、工厂方法模式、抽象工厂模式他们之间的区别
(1)、简单工程模式生产鼠标:苹果鼠标、联想鼠标、惠普鼠标、戴尔鼠标等,第一他们都是鼠标这个类型、第二他们都是在同一个工厂方法生成,每次添加品类时都要修改工程方法;比如添加华硕鼠标、小米鼠标就要修改简单工厂的工厂方法。
(2)、工厂方法模式生产鼠标:工厂方法解决了简单工厂没添加一个品类就要修改工厂方法的这个问题;抽象工厂类 mouseFactory,每个品类都实现自己的工厂类,比如appleMouseFactory、lenoveMouseFactory、xiaomiMouseFactory …… 等这样每次扩展工厂类就可以了
(3)、抽象工厂:抽象工厂中的多个抽象方法是来生成不同产品类的方法,有的文章中看到是同一产品类的不同属性,这样的话使用建造者模式应该是更合适。比如抽象工厂中有鼠标、键盘生成抽象方法,如果还想加类型则可以添加耳机抽象方法……这样所有子类都要实现他的抽象方法来生成不同类型的产品。
(4)、因为工厂方法适合拥有一个抽象产品类,每个工厂对应一个产品,比如薯条/鸡翅工厂;而抽象工厂适合拥有多个抽象产品类,每个工厂对应一个产品线,比如全家桶/xx套餐工厂
(5)、普通工厂模式只生产一种产品,抽象生产多种产品。
4、实现
(1)、抽象产品族类
/***
* 抽象产品类
*/
public interface Keyboard {
void desc();
}
public interface Mouse {
void desc();
}
(2)、抽象产品实现类
public class LogitechMouse implements Mouse {
@Override
public void desc() {
System.out.println("各个价位都有、选择丰富……");
}
}
public class AppleMouse implements Mouse {
@Override
public void desc() {
System.out.println("功能强大、好用、略贵……");
}
}
public class LogitechKeyboard implements Keyboard {
@Override
public void desc() {
System.out.println("品类繁多、功能强大……");
}
}
public class AppleKeyboard implements Keyboard {
@Override
public void desc() {
System.out.println("精致、小巧、好用……");
}
}
(3)、抽象工厂类
/***
* 抽象工厂类
*/
public interface IFactory {
/**
* mouse 产品类工厂抽象方法
*
* @return
*/
Mouse mouseCreate();
/**
* keyboard 产品类工厂抽象方法
*
* @return
*/
Keyboard keyboardCreate();
}
(4)、抽象工厂实现类
/**
* 工厂实现类
*/
public class AppleFactory implements IFactory {
@Override
public Mouse mouseCreate() {
return new AppleMouse();
}
@Override
public Keyboard keyboardCreate() {
return new AppleKeyboard();
}
}
/**
* 抽象工厂实现类
*/
public class LogitechFactory implements IFactory {
@Override
public Mouse mouseCreate() {
return new LogitechMouse();
}
@Override
public Keyboard keyboardCreate() {
return new LogitechKeyboard();
}
}
(5)、test
// apple 下的两种产品
IFactory appleFactory = new AppleFactory();
Mouse appleMouse = appleFactory.mouseCreate();
Keyboard appleKeyboard = appleFactory.keyboardCreate();
appleMouse.desc();
appleKeyboard.desc();
// logitech 下的两种产品
IFactory logitechFactory = new LogitechFactory();
Mouse logitechMouse = logitechFactory.mouseCreate();
Keyboard logitechKeyboard = logitechFactory.keyboardCreate();
logitechMouse.desc();
logitechKeyboard.desc();
四、工厂模式、建造者模式
1、工厂模式和建造者模式都属于创建型模式。
2、建造者模式更关注的是一个产品的建造的具体操作、是一个复杂产品的建造;更在意单个复杂对象的创建。
3、工厂模式更关注抽象产品类的实现类的创建;更在意抽象产品类的创建。
4、两种模式对象表示和创建是分开的。