java设计模式之工厂模式

来源:互联网 发布:局域网电话软件 编辑:程序博客网 时间:2024/06/05 06:07

提到工厂模式,就不得不提关于软件开发的设计原则,这里我们先只讲其中的两个设计原则。
一、开闭原则:
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。
二:迪米特法则:
迪米特法则也称为最少知道法则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
工厂模式主要分为两种:一种是简单工厂模式,一种是工厂方法模式。
先来做简单工厂模式:业务场景,有一家工厂,他现在在生产两种电脑,一种是宏基,另一种是联想,具体的实现代码如下:
第一步:定义一个电脑的接口,提供一个获取电脑名字的方法

package com.zzit.simplefactory;/** * 电脑接口,各种品牌的电脑都需要实现该接口 * @author yufu * */public interface Computer {    void getBranch();}

第二步:分别定义宏基和联想的这两种电脑类,并实现电脑接口

package com.zzit.simplefactory;/** * 宏基电脑 * @author yufu * */public class Acer implements Computer {    @Override    public void getBranch() {        System.out.println("生产宏基电脑");    }}
package com.zzit.simplefactory;/** * 联想电脑 * @author yufu * */public class Lenovo implements Computer{    @Override    public void getBranch() {        System.out.println("生产联想电脑");    }}

第三步:new电脑工厂

package com.zzit.simplefactory;/** * 生产电脑的工厂,根据传入类型的不同,生产处不同品牌的电脑 * @author yufu * */public class ComputerFactory {    public Computer produce(String type) {        if ("lenovo".equals(type)) {            return new Lenovo();        } else if ("acer".equals(type)) {            return new Acer();        } else {            System.out.println("请输出正确的类型");        }        return null;    }}

测试代码:

package com.zzit.simplefactory;public class Test {    public static void main(String[] args) {        ComputerFactory cf = new ComputerFactory();        Computer c = cf.produce("acer");        c.getBranch();    }}

实际上,简单工厂模式除了根据传入名称不同来获取不同电脑品牌的方法外,还可以定义多个方法,返回不同品牌的电脑,实现代码如下:

package com.zzit.simplefactory2;/** * 生产电脑的工厂,根据传入类型的不同,生产处不同品牌的电脑 * @author yufu * */public class ComputerFactory {    public Acer produceAcer() {        return new Acer();    }    public Lenovo produceLenovo(){        return new Lenovo();    }}

测试代码如下:

package com.zzit.simplefactory2;public class Test {    public static void main(String[] args) {        ComputerFactory cf = new ComputerFactory();        Acer acer=cf.produceAcer();        acer.getBranch();    }}

简单工厂模式虽然简单,但是它违背了软件开发的原则,如果要生产别的品牌的电脑,则需要修改工厂类的源代码来实现。
工厂方法模式:
工厂方法模式和简单工厂模式有类似的地方,但是它是每一个类对应一个工厂,这样如果要生产新的品牌电脑,直接建工厂就行了,不需要修改原来的工厂类。
第一步:抽象出电脑品牌类的接口

package com.zzit.factorymethod;/** * 电脑接口,各种品牌的电脑都需要实现该接口 * @author yufu * */public interface Computer {    void getBranch();}

第二步:针对Computer接口建不同的实现类:

package com.zzit.factorymethod;/** * 宏基电脑 * @author yufu * */public class Acer implements Computer {    @Override    public void getBranch() {        System.out.println("生产宏基电脑");    }}
package com.zzit.factorymethod;/** * 联想电脑 *  * @author yufu * */public class Lenovo implements Computer {    @Override    public void getBranch() {        System.out.println("生产联想电脑");    }}

第三步:针对每一个实现类建不同的工厂类。

package com.zzit.factorymethod;public class AcerFactory {    public static Acer produceAcer(){        return new Acer();    }}
package com.zzit.factorymethod;public class LenovoFactory {    public static Lenovo produceLenovo(){        return new Lenovo();    }}

测试代码如下:

package com.zzit.factorymethod;public class Test {    public static void main(String[] args) {        Computer c=LenovoFactory.produceLenovo();        c.getBranch();    }}

工厂方法模式虽然符合了软件开发的设计原则,但是无形中也增加了很多类,时间开发中我们要根据自己项目的实践情况,合理选择适合自己的设计模式。

阅读全文
0 0
原创粉丝点击