首页 > 代码库 > java设计模式--创建型模式

java设计模式--创建型模式

2016-04-24 10:10:34

创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 

 这三种模式从上到下逐步抽象,并且更具一般性。GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。

工厂方法模式

(1)简单工厂模式(又叫静态工厂方法模式)

    通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

    模式中包含的角色及其职责:

    1.工厂(Creator)角色
    简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

    2.抽象(Product)角色
    简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

    3.具体产品(Concrete Product)角色
    简单工厂模式所创建的具体实例对象

例子:采集水果,如苹果、香蕉

Apple和Banana是具体产品角色;Fruit是抽象角色,是Apple和Banana的公共接口;FruitFactory是工厂角色,负责创建Apple和Banana实例。

public interface Fruit {    /*     * 采集     */    public void get();}
public class Apple implements Fruit{    /*     * 采集     */    public void get(){        System.out.println("采集苹果");    }}
public class Banana implements Fruit{    /*     * 采集     */    public void get(){        System.out.println("采集香蕉");    }
public class FruitFactory {    /*     * 获得Apple类的实例     */    public static  Fruit getApple() {        return new Apple();    }        /*     * 获得Banana类实例     */    public static Fruit getBanana() {        return new Banana();    }}
public class MainClass {    public static void main(String[] args) {        Fruit apple = FruitFactory.getApple();        Fruit banana = FruitFactory.getBanana();        apple.get();        banana.get();}

还可以修改工厂方法为

public class FruitFactory {    /*     * getFruit方法,获得所有产品对象     */    public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {        Class fruit = Class.forName(type);            return (Fruit) fruit.newInstance();                    }}

这样动态的加载和创建Class类,但是没有注意大小写;

进一步修改为:

public class FruitFactory {    /*     * getFruit方法,获得所有产品对象     */    public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {        if(type.equalsIgnoreCase("apple")) {            return Apple.class.newInstance();                    } else if(type.equalsIgnoreCase("banana")) {            return Banana.class.newInstance();        } else {            System.out.println("找不到相应的实例化类");            return null;        }                            }}

然后

public class MainClass {    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {                Fruit apple = FruitFactory.getFruit("Apple");        Fruit banana = FruitFactory.getFruit("Banana");        apple.get();        banana.get();            }}

简单工厂模式的优缺点:

    在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去   创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。

     不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。例如增加一种水果-梨子,需要在FruitFactory中继续写else if语句,不符合开放封闭原则。这时候考虑下面的工厂方法模式。

(2)工厂方法模式(又叫多态工厂模式)

    工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体   工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

    模式中包含的角色及其职责:

    1.抽象工厂(Creator)角色
    工厂方法模式的核心,任何工厂类都必须实现这个接口。

    2.具体工厂( Concrete Creator)角色
    具体工厂类是抽象工厂的一个实现,负责实例化产品对象。

    3.抽象(Product)角色
    工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

    4.具体产品(Concrete Product)角色
    工厂方法模式所创建的具体实例对象

 

抽象工厂模式

 

单例模式

 

建造者模式

Builder模式,也叫生成器模式。Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

建造者模式的结构:

技术分享

建造者模式应用场景:

1、对象的创建:Builder模式是为对象的创建而设计的模式

2、创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象

3、关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法

原型模式

定义一个Person类

public class Person {    // 姓名    private String name;    // 年龄    private int age;    // 性别    private String sex;        public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }}

通常我们使用new来创建实例

public class MainClass {    public static void main(String[] args) {        Person person1 = new Person();        person1.setName("ZhangSan");        person1.setAge(30);        person1.setSex("男");        Person person2 = new Person();        person2.setName("LiSi");        person2.setAge(30);        person2.setSex("男");   }}

这两个对象person1、person2除了名字,其他相同.我们不想进行重复的设置,想复制person1,可以使用原型模式。

原型模式应用场景:

1、在创建对象的时候,我们不只是希望被创建的对象继承其基类的基本结构,还希望继承原型对象的数据。

2、希望对目标对象的修改不影响既有的原型对象(深度克隆的时候可以完全互不影响)。

3、隐藏克隆操作的细节。很多时候,对对象本身的克隆需要涉及到类本身的数据细节。

原型模式的特点:

1. 由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。

2.目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。

3.根据对象克隆深度层次的不同,有浅度克隆与深度克隆。

浅度克隆:

 

深度克隆:

 

 

java设计模式--创建型模式