Java经典23种设计模式之创造型模式(一)

来源:互联网 发布:淘宝千里眼干什么用的 编辑:程序博客网 时间:2024/04/29 17:13

    设计模式被称为程序员的内功,之前零零散散的看过一大部分,但自己么有总结过,故此次在这里总结下。值得一提的是,设计模式并非Java所特有。因为一直搞Android,这里就用Java为载体。最经典的设计模式有23种,分三个大类型: 创建型模式(5) 、结构型模式(7)、行为型模式(11),5 + 7 +11 = 23.网上一搜也都是一大把了,这里仅仅是个人作的记录。本文记录创造型模式里的工厂方法(Factory Method)、抽象工厂(Abstract Factory)、单例模式这三种,力求透彻。

    一、工厂方法

工厂方法牵涉到四个概念,为了通俗理解,先借用网上一个例子。男的带女的去肯德基吃饭,男的首先说要汉堡,具体啥汉堡让MM来说。个人觉得这个例子不是很恰当,容易让人造成误解。最简单的例子,就是有很多个工厂,每个工厂都能生产特定的产品。为了清晰理解,还是结合Java设计模式(疯狂Java联盟版)来介绍。

1、Product 即产品,是个接口,具体干啥没说。

public interface Work {
    void doWork();
}

2、ConcreteProduct,具体的产品。即实现了上面共同的work接口,但是做不同的事。做同样事情的当然就是一个类的概念了。

public class StudentWork implements Work {
    public void doWork() {
        System.out.println("学生*作业!");
    }
}

public class TeacherWork implements Work {
    public void doWork() {
        System.out.println("老师审批作业!");
    }
}

这里定义了两个具体的产品,学生的工作就是作业,老师的工作就是审批作业。

3、Creator,创造器。与上面的Product对应,Creator的目的就是获得Product,获得产品。

public interface IWorkFactory {
    Work getWork();
}

4、ConcreteCreator,具体的创造器。创造器获得Work,那么所有的具体的产品都满足要求。对每一个产品都封装到一个工厂里。

public class StudentWorkFactory implements IWorkFactory {


    public Work getWork() {
        return new StudentWork();
    }


}


public class TeacherWorkFactory implements IWorkFactory {


    public Work getWork() {
        return new TeacherWork();
    }


}

测试代码如下:

public class Test {


    public static void main(String[] args) {
        IWorkFactory studentWorkFactory = new StudentWorkFactory();
        studentWorkFactory.getWork().doWork();
        
        IWorkFactory teacherWorkFactory = new TeacherWorkFactory();
        teacherWorkFactory.getWork().doWork();
    }

}
适用性:

    1.当一个类不知道它所必须创建的对象的类的时候。

    2.当一个类希望由它的子类来指定它所创建的对象的时候。

    3.当想将创建对象的职责委托给多个帮助类中的某一个,并且希望将哪一个帮助子类是代理者这一信息局部化的时候。

二、抽象工厂

有了上面的例子就很好理解抽象工厂了。举个例子,去商店买东西,商店就是Factory,你要啥直接说,店员就给你拿啥。

结合上面的例子,定义一个WorkFactory实现IWorkFactory接口,在WorkFactory里传进去一个参数,根据参数判断是new一个StudentWork还是TeacherWork,然后return。这就是抽象工厂。这是最简单、直白的理解。为了清晰理解,下面再附一个复杂的例子。

1、AbstractProduct 抽象产品

public interface ICat {
    void eat();
}


public interface IDog {


    void eat();
}

2、ConcreteProduct 具体产品

public class BlackCat implements ICat {
    public void eat() {
        System.out.println("The black cat is eating!");
    }
}


public class WhiteCat implements ICat {


    public void eat() {
        Sy*tem.out.prin*ln("The w*ite cat is eating!*);
    }
}

public class BlackDog implements IDog {


    public void eat() {
        System.out.println("The black dog is eating");
    }


}


public class WhiteDog implements IDog {


    public void eat() {
        System.out.println("The white dog is eat*ng!");
    }


}

3、AbstractFactory 抽象的工厂,接口。

public interface IAnimalFactory {


    ICat createCat();

    IDog createDog();
}

4、

ConcreteFactory 具体的工厂,实现上面的接口.

public class BlackAnimalFactory implements IAnimalFactory {


    public ICat createCat() {
        return new BlackCat();
    }


    public IDog createDog() {
        return new BlackDog();
    }


}


public class WhiteAnimalFactory imp*ements IAnimalFactory {


    public ICat createCat() {
        return new WhiteCat();
    }


    public IDog createDog() {
        return new WhiteDog();
    }


}

测试代码:

public static void main(String[] args) {
    IAnimalFactory blackAnimalFactory = new BlackAnimalFactory();
    ICat blackCat = blackAnimalFactory.createCat();
    blackCat.eat();
    IDog blackDog = blackAnimalFactory.createDog();
    blackDog.eat();
    
    IAnimalFactory whiteAnimalFactory = new WhiteAnimalFactory();
    ICat whiteCat = whiteAnimalFactory.createCat();
    whiteCat.eat();
    IDog whiteDog = whiteAnimalFactory.createDog();
    whiteDog.eat();
}

注:可以看到这个复杂的例子就用interface来表述了工厂根据不同的需要创造不同的产品,而简单的例子是传参数确定不同的产品。

使用场合:

1.一个系统要独立于它的产品的创建、组合和表示时。
2.一个系统要由多个产品系列中的一个来配置时。
3.当你要强调一系列相关的产品对象的设计以便进行联合使用时*
4当你提供一个产品类库,而只想显示它们的接口而不是实现时。

三、单例模式

这种模式用的比较多,参见博文对此说的非常明白了,我就不重述了。

要点:

1就是为了线程调用的安全性,加上同步锁,为了效率使用双重锁定。

2、除了这种经典的单例外还有其他单例模式。


0 0
原创粉丝点击