人生如此失败,来一瓶82年拉菲醉醉醉醉里苦学工厂模式

来源:互联网 发布:txt文件拆分工具 知乎 编辑:程序博客网 时间:2024/04/29 13:51

    双手停止写Java,把视线从eclipse转移,活动一下脖子,转动15度,转动30度,转动45度,接着转啊……

    我靠,转动至45度,再难转动了,我的双眼定在了东北方向的朝鲜,一个魁梧、Strong,伟岸的人物映入了我的眼帘——金正恩,正在感情充沛,气势恢宏的给国民谈论宏图伟业!他28岁,就当了国家领袖啊!他28岁,就当了国家领袖啊!他28岁,就当了国家领袖啊!

    自己呢?年龄与之相差不大,人生所达到的高度和境界竟如此天地悬殊,每思至此,夜不能寐,还好现在是白天,那就来一瓶82年拉菲,一醉方休吧!

醉醉醉,醉后岂能休息,我靠,我要保持清醒和理智,继续在eclipse上敲代码啊,苦学一下工厂模式吧!

    《Java与模式》一书中将工厂模式分为三类:简单工厂模式;工厂方法模式;抽象工厂模式。

      也有的将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。即将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。接下来,详细学习下每一种工厂模式!

 

简单工厂模式

    简单工厂模式又称静态工厂方法模式,定义一个用于创建对象的接口,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交警蜀黍站在红绿灯路口,决定放行哪一个方向的车辆一样。

    坚持不懈,老习惯,结合代码实例来看下简单工厂模式的组成:

    抽象产品角色:它一般是具体产品继承的父类或者实现的接口。

public interface Lafite {public void drink();}

    具体产品角色:工厂类所创建的对象就是此角色的实例。   

public class Lafite82 implements Lafite{public void drink() {System.out.println("Lafite82,great!!!");}}
public class Lafite92 implements Lafite {public void drink() {System.out.println("Lafite92,great!!!");}}

    工厂类角色:这是简单工厂模式的核心,含有一定的商业逻辑和判断逻辑。

public class LafiteFactory {public static Lafite create(String s){
if(s.equals("Lafite82")){return new Lafite82();}if(s.equals("Lafite92")){return new Lafite92();}return null;}}
    最后,写一个测试类:

public class DrinkLafite {private static Lafite lafi;public static void main(String[] args) {// 喝82年拉菲lafi = LafiteFactory.create("Lafite82");lafi.drink();// 喝92年拉菲lafi = LafiteFactory.create("Lafite02");lafi.drink();}}

    看完代码之后,我们来从设计模式的开闭原则(对扩展开放;对改动关闭)的高度评析一下。当新增了一种年份的拉菲之后,需新建一个实现Lafite接口的类,所以对产品部分来说,它是符合开闭原则的;可是工厂部分好像不太理想,由于每增加一种拉菲,都要在工厂类中添加对应的业务逻辑或者推断逻辑,这显然是违背开闭原则的。所以对于新拉菲的添加,工厂类是非常被动的。

    我们举的例子是最简单的情况,在实际应用中,产品可能是一个多层次的树状结构。因为简单工厂模式中仅仅有一个工厂类来响应这些产品,所以这可能累坏工厂类,也可能累坏一直都在累中坚持的程序猿:

    于是,工厂方法模式作为救世主出现了。

 

工厂方法模式

    工厂方法模式是简单工厂模式的进一步抽象和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。

    坚持不懈,老习惯,结合代码实例来看下工厂方法模式的组成:

 抽象产品角色:解释如上!

public interface Lafite {public void drink();}

具体产品角色:解释如上!

public class Lafite82 implements Lafite{public void drink() {System.out.println("Lafite82,great!!!");}}public class Lafite92 implements Lafite {public void drink() {System.out.println("Lafite92,great!!!");}}

抽象工厂角色: 这是工厂方法模式的核心,是具体工厂角色必须实现的接口或者必须继承的父类。

public abstract class Factory {abstract Lafite create();}

具体工厂角色:解释如上! 

public class Lafite82Factory extends Factory {@Overridepublic Lafite create() {return new Lafite82();}}
public class Lafite92Factory extends Factory {@Overridepublic Lafite create() {return new Lafite92();}}
    最后,写一个测试类:

public class DrinkLafite {public static void main(String[] args) {Lafite82Factory lf82=new Lafite82Factory();Lafite lafi82=lf82.create();lafi82.drink();Lafite92Factory lf92=new Lafite92Factory();Lafite lafi92=lf92.create();lafi82.drink();}}

    工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。这样分担了对象承受的压力;而且这样使得结构变得灵活起来——当有新的产品(即新的拉菲)时,只要按照抽象产品角色、抽象工厂角色提供的规则来生成,那么就可以被使用,而不必去修改任何已有的代码。可以看出工厂角色的结构也是符合开闭原则的!

 

抽象工厂模式

进入正题之前,先扯白一句话:“告诉大家什么是产品族:位于不同产品等级结构中,功能相关联的产品组成的家族。”

马上回到抽象工厂模式的话题上,抽象工厂模式和工厂方法模式的差别就在于须要创建对象的复杂程度上,并且抽象工厂模式是三个里面最为抽象、最具一般性的

    坚持不懈,用一个代码实例看看抽象工厂模式的组成部分!

抽象产品角色:解释如上!

 代码如上;

详细产品角色:解释如上!

 代码如上;

抽象工厂角色: 解释如上!

public abstract class AbstractFactory {    public abstract Lafite82 createLafite82<span style="font-family: Arial, Helvetica, sans-serif;">();</span>    public abstract Lafite92 createLafite92();}

详细工厂角色:解释如上!

public class LafiteFactory extends AbstractFactory{    @Override    public Lafite82 createLafite82()<span style="font-family: Arial, Helvetica, sans-serif;"> {</span>        return new Lafite82();    }
    @Override    public Lafite92 createLafite92() {        return new Lafite92();    }    }
    最后,附上一个测试类:

public class Test {    public static void main(String[] args) {        AbstractFactory f = new LafiteFactory();        Lafite lafi82=f.createLafite82();
        lafi82.drink();
        Lafite lafi92=f.createLafite92();
        lafi92.drink();    }}

    通过辛苦的码字,大家可以看出也许工厂方法模式和抽象工厂模式之间并没有什么优劣之分,而是有着各自的应用场景,但是需要提醒的一点是,在应用抽象工厂之前,要先对创建的对象进行系统的分类,产品分类规则,体现出了一个人对于程序猿的良心以及其个人的能力,好的产品分类规则,能极大的为具体的工厂类的选择调用和以后的扩展提供清晰的思路.


    码字的任务基本完成,然而关于拉菲的事实是:活到现在,我还没喝过拉菲了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

1 0