天天看点

【设计模式总结】5、工厂模式——工厂方法模式

前面我们总结了简单工厂,简单工厂运用非常广泛,但有局限性,适用于单用户,即一个Client(相对于工厂的客户),而一旦用户多了就不再适用。

这里我们引入工厂模式之工厂方法模式:

定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。

工厂方法用来处理对象的创建,并将这样的行为封装在子类中。

类图:

【设计模式总结】5、工厂模式——工厂方法模式

两个模块属于平级的关系

这里的createProduct方法就是工厂方法

clientA和B关注怎么制作产品

这里的生产者+消费者也叫创建者类(Creator)

代码实现:

Client.java

public abstract class Client {
    public void orderProduct(String productName)
    {
        Product product = createProduct(productName);//调用工厂方法
        if (product == null)
            System.out.println("没有该产品");
        else
            product.welcomeToUse();
    }

    protected abstract Product createProduct(String type);//工厂方法抽象

}
           

ClientA.java

public class ClientA extends Client{
    protected Product createProduct(String type)
    {//工厂方法实现
        Product product=null;

        if(type.equals("productA"))
            product = new ProductA();
        else if (type.equals("productB"))
            product = null 

        return product;
    }
}
           

ClientB.java

public class ClientB extends Client{
    protected Product createProduct(String type)
    {
        Product product=null;

        if(type.equals("productA"))
            product = null;
        else if (type.equals("productB"))
            product = new ClientBProductB();

        return product;
    }
}
           

Product.java

public abstract class Product {
    private String name;
    private String Price;
    abstract void welcomeToUse();
}
           

ClientAProductA.java

public class ClientAProductA extends Product {
    String name="productA";
    String price="12";
    void welcomeToUse()
    {
        System.out.println(name+":"+price);
    }
}
           

ClientBProductB.java

public class ClientBProductB extends Product {
    String name="productB";
    String price="14";
    void welcomeToUse()
    {
        System.out.println(name+":"+price+",并赠送你张1元消费券");
    }
}
           

测试代码:

Client client1 = new ClientA();
        client1.orderProduct("productA");

        Client client2 = new ClientB();
        client2.orderProduct("productB");
           

运行结果:

【设计模式总结】5、工厂模式——工厂方法模式

总的来说相对于简单工厂,工厂方法将SimpleProductFactory的功能封装成了一个抽象方法,使得可以有多个Client使用,且能确定使用到具体的Client相对应的产品。相对于传统方法,减少了对具体类的依赖,这里引入新的设计原则,即要依赖抽象,不要依赖具体类,这条设计原则也叫依赖倒置原则。

下一节,工厂模式——抽象工厂模式

继续阅读