设计模式(二)工厂模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112

目录

导航

设计模式之六大设计原则
设计模式(一)单例模式
设计模式(二)工厂模式
设计模式(三)策略模式
设计模式(四)适配器模式
设计模式(五)享元模式
设计模式(六)建造者模式
设计模式(七)原型模式
设计模式(八)桥接模式
设计模式(九)外观模式
设计模式(十)组合模式
设计模式(十一)装饰器模式
设计模式(十二)代理模式
设计模式(十三)迭代器模式
设计模式(十四)观察者模式
设计模式(十五)中介者模式
设计模式(十六)命令模式
设计模式(十七)状态模式
设计模式(十八)访问者模式
设计模式(十九)责任链模式
设计模式(二十)解释器模式
设计模式(二十一)备忘录模式
设计模式(二十二)模板模式
设计模式总结篇(为什么要学习设计模式,学习设计模式的好处)

前言

工厂模式提供了一种创建对象的方式,需要生成的对象叫做产品 ,生厂对象的地方叫做工厂 。通过这种方法可以让你的代码可维护性更好。

没有使用设计模式

假如一家店有二种披萨,海鲜披萨和牛肉味的披萨,然后我们创建出下面这样的类, 那么每次当客人需要某种口味的披萨的时候,客人就要实例化相关的类。这样客人就和披萨关联到了一起。耦合度太高。

    class SeafoodPizza{
        String flavor = "Seafood";

    }
    class BeefPizza{

        String flavor = "beef";

    }

工厂模式的目的在于程序的可扩展性。

简单工厂模式

是为了让程序有一个更好地封装,降低程序模块之间的耦合程度。(简单工厂模式不是23种设计模式中的一种)

这样只要通过PizzaStore的getPizza,传入口味,就可以得到一个相关口味的披萨实例了。

public interface Pizza {
}
public class BeefPizza implements Pizza{
    String flavor = "beef";
}
public class SeafoodPizza implements Pizza {
    String flavor = "Seafood";
}

public class PizzaStore {

    public Pizza getPizza(String flavor){
        Pizza pz = null;
        if (flavor.equals("Seafood")){
            pz = new SeafoodPizza();

        } else if (flavor.equals("Beef")){
            pz = new BeefPizza();
        }
        return pz;
    }


}

工厂模式

工厂方法模式组成:
1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
当有新的产品添加的时候,不必修改已有的代码,只要拓展类就行了,符合开闭原则,但是当披萨种类不断变多的时候,就会有很多的工厂实现类和产品类。


public interface IPizzaStore {
       Pizza getPizza();
}
public class BeefPizzaStore implements IPizzaStore{
    @Override
   public Pizza getPizza() {
        return new BeefPizza();
   }
}
public class SeafoodPizzaStore implements IPizzaStore{
    @Override
    public Pizza getPizza() {
        return new SeafoodPizza();
    }
}
public interface Pizza {
}
public class BeefPizza implements Pizza{
    String flavor = "beef";
}
public class SeafoodPizza implements Pizza {
    String flavor = "Seafood";
}

抽象工厂模式

当有多个工厂有多个产品簇的时候,这个时候就要采用抽象工厂模式了。这里我们假设有两个牌子,有一个叫第一牌(First),有一个叫第二牌(Second)。然后他们都能卖pizza和drink

public interface Drink {
}
public class FirstDrink implements Drink {
}
public class SecondDrink implements Drink {
}
public interface Pizza {
}
public class FirstPizza implements Pizza {
}
public class SecondPizza implements Pizza {
}

abstract class Factory {
    abstract Drink getDrink();
    abstract Pizza getPizza();

}

public class FirstStore extends Factory {
    @Override
    Drink getDrink() {
        return new FirstDrink();
    }

    @Override
    Pizza getPizza() {
        return new FirstPizza();
    }
}
public class SecondStore extends Factory {
    @Override
    Drink getDrink() {
        return new SecondDrink();
    }

    @Override
    Pizza getPizza() {
        return new SecondPizza();
    }
}

这样就实现了抽象工厂模式,有一个抽象的工厂,具体的实现类来实现抽象工厂的方法。有产品的接口,各个具体的产品实现产品接口,然后每个具体的工厂可以生产出他旗下的产品。

    public static void main(String[] args) {
        Factory fir = new FirstStore();
        Drink firDrink = fir.getDrink();
        Pizza firPizza = fir.getPizza();
        Factory sec = new SecondStore();
        Drink secDrink = sec.getDrink();
        Pizza secPizza = sec.getPizza();
    }

当我们要增加一个厂家的时候,即增加一个披萨商店牌子(Third),就要增加一组ThirdStore,ThirdDrink,ThridPizza。
假如要增加一个产品,如面条,noodles,那就要增加一个noodles接口,增加一组FirNoodles,SecNoodles实现类,工厂抽象方法要加一个getNoodles抽象方法,每个实现类都实现getNoodles方法。

其实工厂模式,抽象工厂模式,并没有减少我们码代码的工作量,相反还增加了工作量,但是通过抽象工厂模式,我们能使对象之间的耦合程度大大减少,而且我们日后维护代码也更加方便。

Git地址

本篇实例Github地址:https://github.com/stackisok/Design-Pattern/tree/master/src/factory
抽象工厂:https://github.com/stackisok/Design-Pattern/tree/master/src/abFactory

回到最上方


有什么不懂或者不对的地方,欢迎留言。
喜欢LZ文章的小伙伴们,可以关注一波,也可以留言,LZ会回你们的。
觉得写得不错的小伙伴,欢迎转载,但请附上原文地址,谢谢^_^!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章