设计模式------工厂模式

fenlei

1)简单工厂模式(Simple Factory) 

2)工厂方法模式(Factory Method) 

3)抽象工厂模式(Abstract Factory) 

也可将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。 


/**
 * 抽象产品角色
 * @author Administrator
 *
 */
public interface Car {
    public void drive();
}



/**
 * 具体产品类
 * @author Administrator
 *
 */
public class benzCar implements Car {
    @Override
    public void drive() {
        System.out.println("驾驶奔驰车......");
    }

}

/**
 * 具体产品类
 * @author Administrator
 *
 */
public class bmwCar implements Car {

    @Override
    public void drive() {
        System.out.println("驾驶宝马车......");
    }
}


/**
 * 工厂类角色
 * @author Administrator
 *
 */
public class driverFactory {
    //返回类型必须为抽象产品角色
    public static Car dirveCar(String params) throws          Exception{
        //判断逻辑,返回具体的产品角色给Client
        if(params.equals("benzCar")){
            return new benzCar();
        }else if(params.equals("bmwCar")){
            return new bmwCar();
        }else{
            throw new Exception(); 
        }   
    }
}
//客户
public class Client {
    public static void main(String[] args) throws Exception {
        //告诉司机(工厂) 开奔驰车
        Car car=driverFactory.dirveCar("benzCar");
        //下命令开车
        car.drive();
    }
}


/**
 * 抽象产品角色
 * @author Administrator
 *
 */
public interface Car {
    public void drive();
}



/**
 * 具体产品类
 * @author Administrator
 *
 */
public class benzCar implements Car {
    @Override
    public void drive() {
        System.out.println("驾驶奔驰车......");
    }

}

/**
 * 具体产品类
 * @author Administrator
 *
 */
public class bmwCar implements Car {

    @Override
    public void drive() {
        System.out.println("驾驶宝马车......");
    }
}


/**
 * 工厂类角色
 * @author Administrator
 *
 */
public class driverFactory {
    //返回类型必须为抽象产品角色
    public static Car dirveCar(String params) throws          Exception{
        //判断逻辑,返回具体的产品角色给Client
        if(params.equals("benzCar")){
            return new benzCar();
        }else if(params.equals("bmwCar")){
            return new bmwCar();
        }else{
            throw new Exception(); 
        }   
    }
}
//客户
public class Client {
    public static void main(String[] args) throws Exception {
        //告诉司机(工厂) 开奔驰车
        Car car=driverFactory.dirveCar("benzCar");
        //下命令开车
        car.drive();
    }
}

简单工厂模式将逻辑全部集中在单个工厂中,工厂负责生产所有汽车,无论是奔驰还是宝马,缺点是每次加车型都要去工厂里改逻辑。这时工厂方法出现了


/**
 * 抽象产品角色
 * @author Administrator
 *
 */
public interface Car {
    public void drive();
}



/**
 * 具体产品类
 * @author Administrator
 *
 */
public class benzCar implements Car {
    @Override
    public void drive() {
        System.out.println("驾驶奔驰车......");
    }

}

/**
 * 具体产品类
 * @author Administrator
 *
 */
public class bmwCar implements Car {

    @Override
    public void drive() {
        System.out.println("驾驶宝马车......");
    }
}


/**
 * 工厂类角色
 * @author Administrator
 *
 */
public class driverFactory {
    //返回类型必须为抽象产品角色
    public static Car dirveCar(String params) throws          Exception{
        //判断逻辑,返回具体的产品角色给Client
        if(params.equals("benzCar")){
            return new benzCar();
        }else if(params.equals("bmwCar")){
            return new bmwCar();
        }else{
            throw new Exception(); 
        }   
    }
}
//客户
public class Client {
    public static void main(String[] args) throws Exception {
        //告诉司机(工厂) 开奔驰车
        Car car=driverFactory.dirveCar("benzCar");
        //下命令开车
        car.drive();
    }
}



/**
 * 抽象产品角色
 * @author Administrator
 *
 */
abstract class Car {
    abstract void drive();
}


/**
 * 具体产品类
 * @author Administrator
 *
 */
public class bmwCar extends Car {

    @Override
    public void drive() {
        System.out.println("驾驶宝马车......");
    }
}
/**
 * 具体产品类
 * @author Administrator
 *
 */
public class benzCar extends Car {
    @Override
    public void drive() {
        System.out.println("驾驶奔驰车......");
    }
}


/**
 * 抽象工厂角色 用來生产车
 * @author Administrator
 *
 */
public interface abstractFactory {
    public Car driveFactory();

}


/**
 * 具体工厂角色
 * 创建奔驰车对象
 */
public class benzCarFactory implements abstractFactory {
    @Override
    public  Car driveFactory() {
        return new benzCar();
    }
}


/**
 * 具体工厂角色
 * 创建宝马车对象
 */
public class bmwCarFactory implements abstractFactory {
    @Override
    public Car driveFactory() {
        return new bmwCar();
    }
}


//客户
public class Client {
    private static Car benzcar,bmwcar;
    private static abstractFactory benzcarfactory,bmwcarfactory;
    public static void main(String[] args) throws Exception {
        //告诉(工厂) 要奔驰车
        benzcarfactory=new benzCarFactory();
        benzcar=benzcarfactory.driveFactory();
        //可以开车了
        benzcar.drive();
        System.out.println("-------------------");
        bmwcarfactory=new bmwCarFactory();
        bmwcar=bmwcarfactory.driveFactory();
        bmwcar.drive();
    }
}


多个工厂,每个工厂生产自己的一种车

抽象工厂模式

/**
 * 抽象产品角色
 * @author Administrator
 *
 */
public interface Car {
    public void drive();
}



/**
 * 具体产品类
 * @author Administrator
 *
 */
public class benzCar implements Car {
    @Override
    public void drive() {
        System.out.println("驾驶奔驰车......");
    }

}

/**
 * 具体产品类
 * @author Administrator
 *
 */
public class bmwCar implements Car {

    @Override
    public void drive() {
        System.out.println("驾驶宝马车......");
    }
}


/**
 * 工厂类角色
 * @author Administrator
 *
 */
public class driverFactory {
    //返回类型必须为抽象产品角色
    public static Car dirveCar(String params) throws          Exception{
        //判断逻辑,返回具体的产品角色给Client
        if(params.equals("benzCar")){
            return new benzCar();
        }else if(params.equals("bmwCar")){
            return new bmwCar();
        }else{
            throw new Exception(); 
        }   
    }
}
//客户
public class Client {
    public static void main(String[] args) throws Exception {
        //告诉司机(工厂) 开奔驰车
        Car car=driverFactory.dirveCar("benzCar");
        //下命令开车
        car.drive();
    }
}

/**
 * 抽象产品角色
 * @author Administrator
 *
 */
abstract class Car {
    abstract void drive();
}


/**
 * 具体产品类
 * @author Administrator
 *
 */
public class bmwCar extends Car {

    @Override
    public void drive() {
        System.out.println("驾驶宝马车......");
    }
}
/**
 * 具体产品类
 * @author Administrator
 *
 */
public class benzCar extends Car {
    @Override
    public void drive() {
        System.out.println("驾驶奔驰车......");
    }
}


/**
 * 抽象工厂角色 用來生产车
 * @author Administrator
 *
 */
public interface abstractFactory {
    public Car driveFactory();

}


/**
 * 具体工厂角色
 * 创建奔驰车对象
 */
public class benzCarFactory implements abstractFactory {
    @Override
    public  Car driveFactory() {
        return new benzCar();
    }
}


/**
 * 具体工厂角色
 * 创建宝马车对象
 */
public class bmwCarFactory implements abstractFactory {
    @Override
    public Car driveFactory() {
        return new bmwCar();
    }
}


//客户
public class Client {
    private static Car benzcar,bmwcar;
    private static abstractFactory benzcarfactory,bmwcarfactory;
    public static void main(String[] args) throws Exception {
        //告诉(工厂) 要奔驰车
        benzcarfactory=new benzCarFactory();
        benzcar=benzcarfactory.driveFactory();
        //可以开车了
        benzcar.drive();
        System.out.println("-------------------");
        bmwcarfactory=new bmwCarFactory();
        bmwcar=bmwcarfactory.driveFactory();
        bmwcar.drive();
    }
}




// 抽象工厂类  定义不同的产品之间的标准,商务车
public interface ICarA {
    public void drive();
}


// 抽象工厂类  定义不同的产品之间的标准 跑车族
public interface ICarB {
    public void drive();
}

//具体产品类
public class productAHongqi implements ICarA {
    @Override
    public void drive() {
        System.out.println("开商务族--红旗车");
    }
}

//具体工厂类
public class productABmw implements ICarA {
    @Override
    public void drive() {
         System.out.println("开商务族--宝马车 ..."); 
    }
}

//具体产品类
public class producSporttBAudi implements ICarB {
    @Override
    public void drive() {
        System.out.println("开跑车族--奥迪车...");
    }
}


//具体工厂类
public class productSportBBenz implements ICarB {
    @Override
    public void drive() {
         System.out.println("开跑车族--奔驰车 ..."); 
    }
}


/**
 * 抽象工厂类 创建跑车族跑车
 * @author Administrator
 *
 */
public abstract class abstractoryFactory1 {
    abstract ICarB getProductBBenz();
    abstract ICarB getProductBAudi();
}


/**
 * 抽象工厂类  创建商务族跑车
 * @author Administrator
 *
 */
public abstract class abstractoryFactory2 {
    abstract ICarA getProductABmw();
    abstract ICarA getProductBHongqi();
}


/**
 * 具体工厂类 跑车族
 * @author Administrator
 *
 */
public class Factory1 extends abstractoryFactory1 {

    @Override
    ICarB getProductBBenz() {
        return new productSportBBenz();
    }

    @Override
    ICarB getProductBAudi() {
        return new producSporttBAudi();
    }
}


/**
 * 具体工厂类
 * 商务族
 * @author Administrator
 *
 */
public class Factory2 extends abstractoryFactory2 {
    @Override
    ICarA getProductABmw() {
        return new productABmw();
    }

    @Override
    ICarA getProductBHongqi() {
        return new productAHongqi();
    }
}


public class Client {
    public static void main(String[] args) {
        //工厂一制造的产品族车
        abstractoryFactory1 factory1 = new Factory1(); 
        ICarB productsportAbenz = factory1.getProductBBenz(); 
        ICarB productsportBaudi = factory1.getProductBAudi(); 

        productsportAbenz.drive(); 
        productsportBaudi.drive(); 
        //工厂二制造的产品族车
        abstractoryFactory2 factory2 = new Factory2(); 
        ICarA productAbmw = factory2.getProductABmw(); 
        ICarA productBhongqi = factory2.getProductBHongqi(); 
        productAbmw.drive(); 
        productBhongqi.drive(); 
    }
}

表面上抽象工厂就是每个工厂里有一系列的产品(单个产品族,例如跑车)

六、和工厂方法模式区别 

工厂方法模式: 
一个抽象产品类,可以派生出多个具体产品类。 
一个抽象工厂类,可以派生出多个具体工厂类。 
每个具体工厂类只能创建 一个 具体产品类的实例。 
抽象工厂模式: 
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 
一个抽象工厂类,可以派生出多个具体工厂类。 
每个具体工厂类可以创建 多个 具体产品类的实例。 
区别: 
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个(产品族)。 
工厂方法模式的具体工厂类只能创建一个具体产品类的实例(一对一),而抽象工厂模式可以创建多个具体产品类的实例(一对多)。
/**
 * 抽象产品角色
 * @author Administrator
 *
 */
abstract class Car {
    abstract void drive();
}


/**
 * 具体产品类
 * @author Administrator
 *
 */
public class bmwCar extends Car {

    @Override
    public void drive() {
        System.out.println("驾驶宝马车......");
    }
}
/**
 * 具体产品类
 * @author Administrator
 *
 */
public class benzCar extends Car {
    @Override
    public void drive() {
        System.out.println("驾驶奔驰车......");
    }
}


/**
 * 抽象工厂角色 用來生产车
 * @author Administrator
 *
 */
public interface abstractFactory {
    public Car driveFactory();

}


/**
 * 具体工厂角色
 * 创建奔驰车对象
 */
public class benzCarFactory implements abstractFactory {
    @Override
    public  Car driveFactory() {
        return new benzCar();
    }
}


/**
 * 具体工厂角色
 * 创建宝马车对象
 */
public class bmwCarFactory implements abstractFactory {
    @Override
    public Car driveFactory() {
        return new bmwCar();
    }
}


//客户
public class Client {
    private static Car benzcar,bmwcar;
    private static abstractFactory benzcarfactory,bmwcarfactory;
    public static void main(String[] args) throws Exception {
        //告诉(工厂) 要奔驰车
        benzcarfactory=new benzCarFactory();
        benzcar=benzcarfactory.driveFactory();
        //可以开车了
        benzcar.drive();
        System.out.println("-------------------");
        bmwcarfactory=new bmwCarFactory();
        bmwcar=bmwcarfactory.driveFactory();
        bmwcar.drive();
    }
}

// 抽象工厂类  定义不同的产品之间的标准,商务车
public interface ICarA {
    public void drive();
}


// 抽象工厂类  定义不同的产品之间的标准 跑车族
public interface ICarB {
    public void drive();
}

//具体产品类
public class productAHongqi implements ICarA {
    @Override
    public void drive() {
        System.out.println("开商务族--红旗车");
    }
}

//具体工厂类
public class productABmw implements ICarA {
    @Override
    public void drive() {
         System.out.println("开商务族--宝马车 ..."); 
    }
}

//具体产品类
public class producSporttBAudi implements ICarB {
    @Override
    public void drive() {
        System.out.println("开跑车族--奥迪车...");
    }
}


//具体工厂类
public class productSportBBenz implements ICarB {
    @Override
    public void drive() {
         System.out.println("开跑车族--奔驰车 ..."); 
    }
}


/**
 * 抽象工厂类 创建跑车族跑车
 * @author Administrator
 *
 */
public abstract class abstractoryFactory1 {
    abstract ICarB getProductBBenz();
    abstract ICarB getProductBAudi();
}


/**
 * 抽象工厂类  创建商务族跑车
 * @author Administrator
 *
 */
public abstract class abstractoryFactory2 {
    abstract ICarA getProductABmw();
    abstract ICarA getProductBHongqi();
}


/**
 * 具体工厂类 跑车族
 * @author Administrator
 *
 */
public class Factory1 extends abstractoryFactory1 {

    @Override
    ICarB getProductBBenz() {
        return new productSportBBenz();
    }

    @Override
    ICarB getProductBAudi() {
        return new producSporttBAudi();
    }
}


/**
 * 具体工厂类
 * 商务族
 * @author Administrator
 *
 */
public class Factory2 extends abstractoryFactory2 {
    @Override
    ICarA getProductABmw() {
        return new productABmw();
    }

    @Override
    ICarA getProductBHongqi() {
        return new productAHongqi();
    }
}


public class Client {
    public static void main(String[] args) {
        //工厂一制造的产品族车
        abstractoryFactory1 factory1 = new Factory1(); 
        ICarB productsportAbenz = factory1.getProductBBenz(); 
        ICarB productsportBaudi = factory1.getProductBAudi(); 

        productsportAbenz.drive(); 
        productsportBaudi.drive(); 
        //工厂二制造的产品族车
        abstractoryFactory2 factory2 = new Factory2(); 
        ICarA productAbmw = factory2.getProductABmw(); 
        ICarA productBhongqi = factory2.getProductBHongqi(); 
        productAbmw.drive(); 
        productBhongqi.drive(); 
    }
}

六、和工厂方法模式区别 
工厂方法模式: 
一个抽象产品类,可以派生出多个具体产品类。 
一个抽象工厂类,可以派生出多个具体工厂类。 
每个具体工厂类只能创建一个具体产品类的实例。 
抽象工厂模式: 
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 
一个抽象工厂类,可以派生出多个具体工厂类。 
每个具体工厂类可以创建多个具体产品类的实例。 
区别: 
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个(产品族)。 
工厂方法模式的具体工厂类只能创建一个具体产品类的实例(一对一),而抽象工厂模式可以创建多个具体产品类的实例(一对多)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值