工厂模式
一、工厂模式介绍
工厂模式是Java最常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们创建对象时不会对创建者暴露创建逻辑,并且用一个共同的接口来指向创建的对象。
工厂模式的优点:
1、可以使代码结构清晰,有效的封装变化。在实际编程中,产品类的实例化有时是复杂和多变的,通过工厂模式,将产品的实例化过程封装起来,使调用这无需关系产品实例化的过程。
2、对调用者屏蔽具体的产品类,调用者只需要关系产品的接口即可,用接口来接收产品对象
3、降低耦合度
工厂模式可以分为三类:
- 简单工厂模式(Simply Factory)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
简单工厂其实并不是标准的设计模式,GOF 23种设计模式中只有工厂方法模式和抽象工厂模式。简单工厂模式可以看成工厂方法模式的一种特例。
二、简单工厂模式
简单工厂模式包含 3 个角色(要素):
- Factory:即工厂类, 简单工厂模式的核心部分,负责实现创建所有产品的内部逻辑;工厂类可以被外界直接调用,创建所需对象。通过创建产品方法的参数不同返回不同的产品。
- Product:抽象类产品, 它是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。
- ConcreteProduct:具体产品, 它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。它要实现抽象产品中声明的抽象方法。
设计一个产品的接口或者抽象类,派生出很多种产品。在一个工厂类中设计一个方法,返回接口或者抽象类,在该方法中用switch/case,或者if/else语句根据参数 new出不同的实现类返回。比较简单代码省略。

三、工厂方法模式
工厂方法模式包含 4 个角色(要素):
- Product:抽象产品,定义工厂方法所创建的对象的接口,也就是实际需要使用的对象的接口。
- ConcreteProduct:具体产品,具体的Product接口的实现对象。
- Factory:工厂接口,也可以叫 Creator(创建器),申明工厂方法,通常返回一个 Product 类型的实例对象。
- ConcreteFactory:工厂实现,或者叫 ConcreteCreator(创建器对象),覆盖 Factory 定义的工厂方法,返回具体的 Product 实例。

代码实例
定义产品接口和工厂接口
//饮料接口
public interface Drink{
public void introduce();
}
//工厂接口
public interface Factory {
public Drink produceDrink();
}
饮料接口的两个实例
public class Cola implements Drink{
@Override
public void introduce() {
System.out.println("coca cola");
}
}
//为了方便写到一个代码块中了
public class Milk implements Drink{
@Override
public void introduce() {
System.out.println("milk");
}
}
两个不同的工厂
public class MilkFactory implements Factory{
@Override
public Drink produceDrink() {
return new Milk();
}
}
public class ColaFactory implements Factory{
@Override
public Drink produceDrink() {
return new Cola();
}
public static void main(String[] args) {
Factory colaFactory = new ColaFactory();
colaFactory.produceDrink().introduce();
Factory milkFactory = new MilkFactory();
milkFactory.produceDrink().introduce();
}
}
四、抽象工厂模式


代码实例
产品定义
//定义一个PC产品接口
public interface PCProduct {
public void info();
}
//定义一个手机产品接口
public interface PhoneProduct {
public void info();
}
//实现PC产品,具体的PC产品
public class Mac implements PCProduct{ //苹果电脑
@Override
public void info() {
System.out.println("苹果电脑");
}
}
public class XiaomiPC implements PCProduct{ //小米电脑
@Override
public void info() {
System.out.println("小米电脑");
}
}
//具体的手机产品
public class XiaomiPtone implements PhoneProduct{
@Override
public void info() {
System.out.println("小米手机");
}
}
public class IPhone implements PhoneProduct{
@Override
public void info() {
System.out.println("苹果手机");
}
}
工厂代码
//抽象工厂生产PC 和手机
public interface ElectricFactory {
public PhoneProduct makePhone();
public PCProduct makePC();
}
//苹果工厂,可以生产手机或者电脑
public class AppleFactory implements ElectricFactory{
@Override
public PhoneProduct makePhone() {
// TODO Auto-generated method stub
return new IPhone();
}
@Override
public PCProduct makePC() {
// TODO Auto-generated method stub
return new Mac();
}
}
//小米工厂
public class XiaomiFactory implements ElectricFactory{
@Override
public PhoneProduct makePhone() {
// TODO Auto-generated method stub
return new XiaomiPtone();
}
@Override
public PCProduct makePC() {
// TODO Auto-generated method stub
return new XiaomiPC();
}
}
测试类
public class Test {
public static void main(String[] args) {
ElectricFactory appleFactory = new AppleFactory();
appleFactory.makePC().info();
appleFactory.makePhone().info();
ElectricFactory xiaoFactory = new XiaomiFactory();
xiaoFactory.makePC().info();
xiaoFactory.makePhone().info();
}
}
这里也可以将产品抽象化为小米产品和苹果产品,那么对应的工厂类就应该为手机工厂(生产小米手机和苹果手机)和PC工厂(生产小米PC和MAC)
这是目前学习理解,具体应该怎么用也不知道,也有很多理解有问题的地方,望见谅。

浙公网安备 33010602011771号