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

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

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


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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值