抽象工厂模式(设计模式_17)

来源:互联网 发布:淘宝卖家怎么设置特价 编辑:程序博客网 时间:2024/04/17 05:33

抽象工厂模式:的简单理解是,用来生成不同的产品族(就像一个家族一样),例如:总工厂,分工厂,每个工厂都可以制造,其他很多不同的产品;

以下举例两个案例,来体现抽象工厂模式:


案例一:(造汽车)
制造各种名牌汽车,有总工厂,分工厂来制造,各种不同品牌的汽车;

package com.oop.demo4.car1;/** * 抽象出奔驰车制作标准规范接口 * @author Liudeli * */public interface BenzCar {    /**     * 制造轮胎     */    public void doTyre();    /**     * 制造发动机     */    public void doEngine();    /**     * 制造底盘     */    public void doChassis();}
package com.oop.demo4.car1;/** * 分公司制造中心 * @author Liudeli * */public class FBenzCar implements BenzCar{    public void doTyre() {        System.out.println("分公司把奔驰的轮胎已经生产好了...");    }    public void doEngine() {        System.out.println("分公司把奔驰的发动机已经研制成功了...");    }    public void doChassis() {        System.out.println("分公司把奔驰的底盘已经制作好了...");    }}
package com.oop.demo4.car1;/** * 总公司制造中心 * @author Liudeli * */public class ZBenzCar implements BenzCar{    public void doTyre() {        System.out.println("总公司把奔驰的轮胎已经生产好了...");    }    public void doEngine() {        System.out.println("总公司把奔驰的发动机已经研制成功了...");    }    public void doChassis() {        System.out.println("总公司把奔驰的底盘已经制作好了...");    }}
package com.oop.demo4.car2;/** * 抽象出宝马车制作标准接口规范 * @author Liudeli * */public interface BMWCar {    /**     * 制造宝马车轮胎     */    public void doDoor();}
package com.oop.demo4.car2;/** * 分公司制造宝马车对象 * @author Liudeli * */public class FBMWCar implements BMWCar {    public void doDoor() {        System.out.println("分公司把宝马车的门制造成功了...");    }}
package com.oop.demo4.car2;/** * 总公司制造宝马车对象 * @author Liudeli * */public class ZBMWCar implements BMWCar{    public void doDoor() {        System.out.println("总公司把宝马车的门制造好了...");    }}
package com.oop.demo4.factory;import com.oop.demo4.car1.BenzCar;import com.oop.demo4.car2.BMWCar;/** * 抽象出工厂接口 * @author Liudeli * */public interface Factory {    /**     * 创建奔驰车     * @return     */    public BenzCar createBeanz();    /**     * 创建宝马车     * @return     */    public BMWCar createBMW();}
package com.oop.demo4.factory;import com.oop.demo4.car1.BenzCar;import com.oop.demo4.car1.FBenzCar;import com.oop.demo4.car2.BMWCar;import com.oop.demo4.car2.FBMWCar;/** * 分工厂 制造厂 * @author Liudeli * */public class FFactory implements Factory{    public BenzCar createBeanz() {        return new FBenzCar();    }    public BMWCar createBMW() {        return new FBMWCar();    }}
package com.oop.demo4.factory;import com.oop.demo4.car1.BenzCar;import com.oop.demo4.car1.ZBenzCar;import com.oop.demo4.car2.BMWCar;import com.oop.demo4.car2.ZBMWCar;/** * 总工厂 制作厂 * @author Liudeli * */public class ZFactory implements Factory{    public BenzCar createBeanz() {        return new ZBenzCar();    }    public BMWCar createBMW() {        return new ZBMWCar();    }}
package com.oop.demo4.main;import com.oop.demo4.car1.BenzCar;import com.oop.demo4.car2.BMWCar;import com.oop.demo4.factory.FFactory;import com.oop.demo4.factory.Factory;import com.oop.demo4.factory.ZFactory;/** * 测试程序 * @author Liudeli * */public class Test {    public static void main(String[] args) {        // 总公司 生产制造厂        Factory factory = new ZFactory();        // 修改成分公司制作厂去制造        // factory = new FFactory();        // 制作奔驰车零件        BenzCar beanz = factory.createBeanz();        beanz.doChassis();        beanz.doEngine();        beanz.doTyre();        // 制作宝马车零件        BMWCar bmw = factory.createBMW();        bmw.doDoor();    }}

运行结果:
这里写图片描述

修改工厂:

Factory factory = new FFactory();

运行结果:
这里写图片描述



案例二:(数据库DB,切换)
软件工程师在维护一个项目,这个项目最初是用Oracle数据库来做的,现在要更换成Sqlserver数据库,有可能以后还会切换到Oracle数据库,所以他想到了一招,就是用抽象工厂模式来切换数据库即可:

package com.oop.demo3;/** * 模拟用户对象数据 * @author Liudeli * */public class User {    // 模拟ID 和 NAME 其他很多值 省略...    private int id;    private String name;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String toString() {        return "User [id=" + id + ", name=" + name + "]";    }}
package com.oop.demo3;/** * 定义数据模版接口标准 * @author Liudeli * */public interface IUser {    /**     * 模拟插入一条用户数据     * @param user     */    public void insert(User user);    /**     * 模拟删除一条数据     * @param id     */    public void detele(int id);}
package com.oop.demo3;/** * 模拟使用SQLServer数据库操作User数据 * @author Liudeli * */public class SQLServerUser implements IUser{    public void insert(User user) {        System.out.println("用户数据 id:1, name:liudeli");    }    public void detele(int id) {        System.out.println("用户数据 id:" + id + "已被删除成功...");    }}
package com.oop.demo3;/** * 模拟使用Oracle数据库操作User数据 * @author Liudeli * */public class OracleUser implements IUser {    public void insert(User user) {        System.out.println("用户数据 id:2, name:lnderly");    }    public void detele(int id) {        System.out.println("用户数据 id:" + id + "已被删除成功...");    }}
package com.oop.demo3;/** * 模拟人的对象数据 * @author Liudeli * */public class Person {    // 模拟name 和 sex 其他很多值 省略...    private String name;    private String sex;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public String toString() {        return "Person [name=" + name + ", sex=" + sex + "]";    }}
package com.oop.demo3;public interface IPerson {    public void update(Person person);}
package com.oop.demo3;public class SQLServerPerson implements IPerson{    public void update(Person person) {        System.out.println("Person 更新了一条数据信息...");    }}
package com.oop.demo3;public class OraclePerson implements IPerson{    public void update(Person person) {        System.out.println("Person 更新了一条数据...");    }}
package com.oop.demo3;/** * 定义规范标准工厂,实例化那个对象 * @author Liudeli * */public interface IFactory {    /**     * 创建使用哪种数据库模式来操作     * @return     */    public IUser createUserFactory();    public IPerson createPersonFactory();}
package com.oop.demo3;public class OracleFactory implements IFactory{    public IUser createUserFactory() {        return new OracleUser();    }    public IPerson createPersonFactory() {        return new OraclePerson();    }}
package com.oop.demo3;public class SQLServerFactory implements IFactory{    public IUser createUserFactory() {        return new SQLServerUser();    }    public IPerson createPersonFactory() {        return new SQLServerPerson();    }}
package com.oop.demo3;/* *  *//** * 测试程序 * @author Liudeli * */public class Main {    public static void main(String[] args) {        // 获取到数据        User user = new User();        Person person = new Person();        // 得到工厂        IFactory factory = new OracleFactory();        // factory = new SQLServerFactory(); // 切换SQLServer数据库        IUser createUserFactory = factory.createUserFactory();        createUserFactory.insert(user);        createUserFactory.detele(9);        IPerson createPersonFactory = factory.createPersonFactory();        createPersonFactory.update(person);    }}

运行结果:
这里写图片描述


谢谢大家的观看,更多精彩技术博客,会不断的更新,请大家访问,
刘德利CSDN博客, http://blog.csdn.net/u011967006

1 0
原创粉丝点击