设计模式-工厂模式

工厂模式:简单工厂,工厂方法,抽象工厂

  1. 简单工厂
    是指由一个工厂对象决定创建出哪一种产品类的实例,不属于23中常用设计模式
    适用于:工厂类负责创建的对象较少的情况
    优点:只需传入一个正确的参数,就可以获取你所需要的对象,无须知道其创建的细节
    缺点:工厂类的职责相对过重,增加新的产品时需要修改工厂类的判断逻辑,违背开闭原则,不易于扩展过于复杂的产品结构

  2. 工厂方法
    是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行–维基百科
    抽象一个工厂接口,产品类实现工厂接口并实例化。扩展产品的时候只需要新增产品类并实现接口就好
    适用于:创建对象需要大量重复的代码,客户端不依赖于产品类实例如何被创建、实现等细节。一个类通过其子类来制定创建哪个对象
    优点:用户只需关心所需产品对应的工厂,无须关心创建细节。加入新产品符合开闭原则,提供了系统的可扩展性
    缺点:类的个数容易过多,增加了代码结构的复杂度。增加了系统的抽象性和理解难度
    3.抽象工厂
    是指提供一个创建一系列相关或相互依赖对象的接口,无须指定他们具体的类
    创建一个可以创建工厂的接口,和需要的产品接口,实例化不同种类的工厂,并且生产不同产品
    适用于:。。。。。
    优点:具体产品在应用层代码隔离,无须关心创建细节,将一个系列的产品族统一到一起创建
    缺点:规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口。增加了系统的抽象性和理解难度

工厂模式代码

  1. 简单工厂

汽车的接口:创建汽车的方法

public interface ICar {

    public void create();
}

汽车的工厂,根据传入的参数,确定生产奥迪汽车还是宝马汽车还是奔驰汽车

public class CarFactory {
    /*public ICar createCar(String name) {
        if("aodi".equals(name)) {
            return new AodiCarFactory();
        }
        if("benchi".equals(name)) {
            return new BenchiFactory();
        }
        if("baoma".equals(name)) {
            return new BaomaCarFactory();
        }
        return null;
    }*/

    /*public ICar createCar(String className) {
        try{
            if(null != className && !"".equals(className)) {
                return (ICar) Class.forName(className).newInstance();
            }
        } catch(Exception e) {
            e.getMessage();
        }
        return null;
    }*/

    public ICar createCar(Class<? extends ICar> clzz) {
        try{
            if(null != clzz) {
                return clzz.newInstance();
            }
        } catch (Exception e) {
            e.getMessage();
        }
        return null;
    }
}

宝马汽车工厂实现汽车接口:用来生产宝马汽车

public class BaomaCarFactory implements ICar {
    public void create() {
        System.out.println("生产宝马汽车");
    }
}

奥迪汽车工厂实现汽车接口:用来创建奥迪汽车

public class AodiCarFactory implements ICar {
    public void create() {
        System.out.println("生产奥迪汽车");
    }
}

奔驰汽车工厂实现汽车接口:用来创建奔驰汽车

public class BenchiFactory implements ICar{

    public void create() {
        System.out.println("生产奔驰汽车");
    }
}

测试类

public class SimpleFactoryTest {
    public static void main(String[] args) {

//        CarFactory carFactory = new CarFactory();
//        ICar benchi = carFactory.createCar("benchi");
//        benchi.create();
//        ICar aodi = carFactory.createCar("aodi");
//        aodi.create();
//        ICar baoma = carFactory.createCar("baoma");
//        baoma.create();

//        CarFactory carFactory = new CarFactory();
//        ICar aodi = carFactory.createCar("com.gupaostu.vip.datouxia.pattern.factory.simplefactory.AodiCarFactory");
//        aodi.create();

        CarFactory carFactory = new CarFactory();// 创建汽车工厂
        carFactory.createCar(AodiCarFactory.class).create();//传入奥迪汽车参数,并创建奥迪汽车
        carFactory.createCar(BaomaCarFactory.class).create();//传入宝马汽车参数,并创建宝马汽车
        carFactory.createCar(BenchiFactory.class).create();//传入奔驰汽车参数,并创奔驰迪汽车


    }
}
  1. 工厂方法
    手机的接口:打电话的方法
public interface IPhone {
    public void call();
}

手机工厂的接口:创建手机

public interface IPhoneFactory {
    public IPhone create();
}

苹果手机类:用苹果手机打电话,实现手机接口

public class ApplePhone implements IPhone {

    public void call() {
        System.out.println("用苹果手机打电话");
    }
}

苹果手机工厂:实现手机工厂接口,创建一个苹果手机

public class ApplePhoneFactory implements IPhoneFactory{

    public IPhone create() {
        return new ApplePhone();
    }
}

华为手机:用华为手机打电话,实现手机接口

public class HuaweiPhone implements IPhone {
    public void call() {
        System.out.println("用华为手机打电话");
    }
}

华为手机工厂:实现手机工厂接口,创建一个华为手机

public class HuaweiPhoneFactory implements IPhoneFactory {

    public IPhone create() {
        return new HuaweiPhone();
    }
}

测试类

public class FacortyMethodTest {
    public static void main(String[] args) {
        IPhoneFactory appleFactory = new ApplePhoneFactory();//  创建一个苹果手机工厂
        IPhone applePhone = appleFactory.create();// 创建一个苹果手机
        applePhone.call();// 使用苹果手机打电话
        IPhoneFactory huaweiFactory = new HuaweiPhoneFactory();
        IPhone huaweiPhone = huaweiFactory.create();
        huaweiPhone.call();
    }
}

如果想扩展一个小米手机,只需要添加一个
小米手机类和小米手机工厂类即可。

public class XiaomiPhone implements IPhone{
    public void call() {
        System.out.println("用小米手机打电话");
    }
}
public class XiaomiPhoneFactory implements IPhoneFactory {
    public IPhone create() {
        return new XiaomiPhone();
    }
}
  1. 抽象工厂
    有三种产品:电视、洗衣机、空调
    有两个公司:美的公司,格力公司。两个公司分别生产这三种产品

电视、洗衣机、空调产品接口类

public interface IDianshi {
    // 电视产品接口类,创建电视的方法
    public void createDianshi();
}
public interface IKongtiao {
	// 空调产品接口类,创建空调的方法
    public void createKongtiao();
}
public interface IXiyiji {
    // 洗衣机产品接口类,创建洗衣机的方法
    public void createXiyiji();
}

抽象工厂接口:创建工厂方法

public interface CompanyFactory {
    public IKongtiao createKongtiaoFactory();// 创建生产空调的工厂
    public IDianshi createDianshiFactory();// 创建生产电视的工厂
    public IXiyiji createXiyijiFactory();// 创建生产洗衣机的工厂
}

格力公司的产品的工厂,实现各个抽象的产品接口,生产各种产品

// 生产格力电视机的工厂
public class GeLiDianshiCompany implements IDianshi{
    public void createDianshi() {
        System.out.println("生产格力电视机");
    }
}
// 生产格力洗衣机的工厂
public class GeLiXiyijiCompany implements IXiyiji{
    public void createXiyiji() {
        System.out.println("生产格力洗衣机");
    }
}
// 生产格力空调的工厂
public class GeLiKongtiaoCompany implements IKongtiao {
    public void createKongtiao() {
        System.out.println("生产格力空调");
    }
}

格力公司的工厂

public class GeliCompanyFactory implements CompanyFactory {
	// 创建生产空调的工厂
    public IKongtiao createKongtiaoFactory() {
        return new GeLiKongtiaoCompany();
    }
	// 创建生产电视的工厂
    public IDianshi createDianshiFactory() {
        return new GeLiDianshiCompany();
    }
	// 创建生产洗衣机的工厂
    public IXiyiji createXiyijiFactory() {
        return new GeLiXiyijiCompany();
    }
}

海尔公司的产品的工厂,实现各个抽象的产品接口,生产各种产品

// 生产海尔电视机的工厂
public class HaierDianshiCompany implements IDianshi {
    public void createDianshi() {
        System.out.println("生产海尔电视机");
    }
}
// 生产海尔洗衣机的工厂
public class HaierXiyijiCompany implements IXiyiji{
    public void createXiyiji() {
        System.out.println("生产海尔洗衣机");
    }
}
// 生产海尔空调的工厂
public class HaierKongtiaoCompany implements IKongtiao {
    public void createKongtiao() {
        System.out.println("生产海尔空调");
    }
}

海尔公司的工厂

public class HaierCompanyFactory implements CompanyFactory{
	// 创建生产空调的工厂
    public IKongtiao createKongtiaoFactory() {
        return new HaierKongtiaoCompany();
    }
	// 创建生产电视的工厂
    public IDianshi createDianshiFactory() {
        return new HaierDianshiCompany();
    }
	// 创建生产洗衣机的工厂
    public IXiyiji createXiyijiFactory() {
        return new HaierXiyijiCompany();
    }
}

测试类

public class AbstractfactoryTest {
    public static void main(String[] args) {
    	// 创建生产格力工厂的工厂
        CompanyFactory geli = new GeliCompanyFactory();
        // 生产一个可以生产格力电视的工厂
        IDianshi dianshiFactory = geli.createDianshiFactory();
        // 生产一个可以生产格力空调的工厂
        IKongtiao kongtiaoFactory = geli.createKongtiaoFactory();
        // 生产一个可以生产格力洗衣机的工厂
        IXiyiji xiyijiFactory = geli.createXiyijiFactory();

        dianshiFactory.createDianshi();// 生产电视
        kongtiaoFactory.createKongtiao();// 生产空调
        xiyijiFactory.createXiyiji();// 生产洗衣机

        CompanyFactory haier = new HaierCompanyFactory();
        haier.createXiyijiFactory().createXiyiji();
        haier.createKongtiaoFactory().createKongtiao();
        haier.createDianshiFactory().createDianshi();
    }
}

工厂模式类结构图
简单工厂
简单工厂
工厂方法
工厂方法
抽象工厂
抽象工厂

深刻理解产品族和产品等级结构之间的关系
产品族:同一个产品族表示一个工厂生产的所有产品,如:电视,空调,洗衣机
产品等级结构:不同工厂生产的同一种产品,如:格力公司的电视,海尔公司的电视

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值