设计模式(创建型)总结

创建型设计模式主要包含:

简单工厂模式(Simple Factory)
工厂方法模式(Factory Method)
抽象工厂模式(Abstract Factory)
原型模式(Prototype)
单例模式(Singleton)
建造者模式(Builder)

主要总结前三类。

以下所有类图翻译中不是创建在一个类里面,你也可以将他们创建在一个类里面

(1)简单工厂模式:

示例类图:

类图翻译:

public class Client {
    public static void main(String[] args) {
        TV tv = TVFactory.produceTV("HisenseTV");
        tv.play();

        TV tv1 = TVFactory.produceTV("HaierTV");
        tv1.play();
    }
}

public class HaierTV implements TV {
    public void play() {
        System.out.println("我是HaierTV!");
    }
}

public class HisenseTV implements TV {
    @Override
    public void play() {
        System.out.println("我是HisenseTV!");
    }
}

public interface TV {
    void play();
}

public class TVFactory {

    public static TV produceTV(String brand){

        if(brand.equalsIgnoreCase("HaierTV"))
        {
            return new HaierTV();       //根据参数创建具体产品
        }
        else if(brand.equalsIgnoreCase("HisenseTV"))
        {
            return new HisenseTV();   //根据参数创建具体产品
        }
        return null;
    }

}

简单工厂模式的优点如下:
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。
客户端无需知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

简单工厂模式的缺点如下:
由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

(2)工厂方法模式:

类图:

类图翻译:

public class Client {

    public static void main(String[] args) {

        TVFactory factory = new HaierTVFactory();
        TV tv = factory.produceTV();
        tv.play();
    }
}
public class HaierTV implements TV {
    public void play() {
        System.out.println("我是HaierTV!");
    }
}
public class HaierTVFactory implements TVFactory {
    @Override
    public TV produceTV() {
        return new HaierTV();
    }
}
public class HisenseTV implements TV {
    @Override
    public void play() {
        System.out.println("我是HisenseTV!");
    }
}
public class HisenseTVFactory implements TVFactory {
    @Override
    public TV produceTV() {
        return new HisenseTV();
    }
}
public interface TV {
    void play();
}
public interface TVFactory {

    TV produceTV();

}

工厂方法模式的优点如下:
在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无需关心创建细节,甚至无需知道具体产品类的类名。
基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式,就正是因为所有的具体工厂类都具有同一抽象父类。
使用工厂方法模式的另一个优点是在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了,这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。

工厂方法模式的缺点如下:
在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。
由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。

(3)抽象工厂模式:

一个工厂创建一个产品族的产品,如HuaWei工厂只创建HuaWei的产品。

类图:

类图翻译:

public class Client {
    public static void main(String[] args) {
        TV haweiTV = new CreateHaWeiFactory().createTV();
        Phone haierPhone = new CreateHaierFactory().createPhone();
        haierPhone.describtion();
        haweiTV.describtion();
        TV haierTV = new CreateHaierFactory().createTV();
        haierTV.describtion();
    }
}

public class CreateHaierFactory implements Factory {
    @Override
    public TV createTV() {
        return new HaierTV();
    }

    @Override
    public Phone createPhone() {
        return new HaierPhone();
    }
}

public class CreateHaWeiFactory implements Factory {
    @Override
    public TV createTV() {
        return new HaWeiTV();
    }

    @Override
    public Phone createPhone() {
        return new HaWeiPhone();
    }
}

public interface Factory {
    TV createTV();
    Phone createPhone();
}

public class HaierPhone implements Phone {
    @Override
    public void describtion() {
        System.out.println("我是HaierPhone!");
    }
}

public class HaierTV implements TV {
    @Override
    public void describtion() {
        System.out.println("我是HaierTV!");
    }
}

public class HaWeiPhone implements Phone {
    @Override
    public void describtion() {
        System.out.println("我是HaWeiPhone!");
    }
}

public class HaWeiTV implements TV {
    @Override
    public void describtion() {
        System.out.println("我是HaWeiTV!");
    }
}

public interface Phone {
    void describtion();
}

public interface TV {
    void describtion();
}




抽象工厂模式的优点如下:
抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。
当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。
增加新的具体工厂和产品族很方便,无需修改已有系统,符合“开闭原则”。

抽象工厂模式的缺点如下:
在添加新的产品对象时,难以扩展抽象工厂以便生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。
开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)

(4)单例模型:只创建一个类的对象

例如:时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值