天天看点

工厂模式(创建型模式)工厂模式

这里写目录标题

  • 工厂模式
    • 1.简单工厂模式
    • 2.工厂方法模式
    • 3.抽象工厂模式(Kit模式)

工厂模式

工厂模式分为简单工厂模式,工厂方法模式,抽象工厂模式。都属于创建型模式,其主要功能都是把对象的实例化部分抽取出来,降低耦合,提高系统的扩展性。

简单来说工厂方法就是把创建对象和使用对象分开。

1.简单工厂模式

工厂类是整个模式的核心,负责实现创建所有实例的内部逻辑。工厂类可以被外部直接调用,创建所需的产品对象。工厂类中有一个负责生产对象的静态方法,系统可以根据共产方法所传入的参数决定应该创建出哪一个产品类的实例。工厂方法是静态的,而且必须有返回类型,返回类型为抽象产品的类型。

简单工厂模式中,工厂类必须包含判断,决定在什么时候创建哪一个产品类的实例。

public interface Phone {
    public void show();
}

public class IPhone implements Phone{
    @Override
    public void show() {
        System.out.println("我是苹果手机");
    }
}

public class HuaweiPhone implements Phone{
    @Override
    public void show() {
        System.out.println("我是华为手机");
    }
}

//工厂类
public class PhoneFactory {
    public static Phone makePhone(String phone) throws Exception{
        //判断
        switch (phone) {
            case "苹果":
                return new IPhone();
            case "华为":
                return new HuaweiPhone();
            default:
                throw new Exception("没有这个手机");
        }
    }
}

//测试类中的一个方法用来测试简单工厂模式
public static void a() {
        try {
            Phone p1 = PhoneFactory.makePhone("苹果");
            p1.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
           

2.工厂方法模式

在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时向客户隐藏了那种具体产品将被实例化这一细节。

工厂模式符合开闭原则。

链接: 七大原则.

但是再添加新产品时,需要编写新的具体的产品类,而且还要提供与之相对应的具体工厂类,难免会增加系统个数,增加系统的开销。

public interface AbstractFactory {
    public Phone makePhone();
}

public class HuaweiFactory implements AbstractFactory{
    @Override
    public Phone makePhone() {
        return new HuaweiPhone();
    }
}


public class IPhoneFactory implements AbstractFactory{
    @Override
    public Phone makePhone() {
        return  new IPhone();
    }
}
           

3.抽象工厂模式(Kit模式)

抽象工厂模式提供了一个创建一系列相关或者依赖对象的接口,而无需指定他们具体的类。

在抽象工厂模式中,增加新的产品族很容易,只需要增加一个新的具体工厂类,并在相应的产品等级结构中增加对应的具体产品了,但是在该模式中,增加新的产品等级结构很困难,需要修改抽象工厂接口和已有的具体工厂类。抽象工厂模式的这个特点称为开闭原则的倾斜性。

public interface PC {
    void color();
    void cpu();
    void desk();
}

public class MacPC implements PC {
    private String color;
    private String cpu;
    private Integer desk;

    public MacPC() {
    }

    public MacPC(String color, String cpu, Integer desk) {
        this.color = color;
        this.cpu = cpu;
        this.desk = desk;
    }

    @Override
    public void color() {
        System.out.println(color);
    }

    @Override
    public void cpu() {
        System.out.println(cpu);
    }

    @Override
    public void desk() {
        System.out.println(desk);
    }
}

public interface MacPCFactory {
    PC makePC();
}


public class MacProFactory implements MacPCFactory {
    @Override
    public PC makePC() {
        return new MacPC("白色", "w1", 512);
    }
}

public class MacAirFactory implements MacPCFactory{
    @Override
    public PC makePC() {
        return new MacPC("银色","w1",256);
    }
}