[知了堂学习笔记]_设计模式之工厂模式

介绍:
工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。

形态:
简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory Method Pattern) ,不利于产生系列产品;
工厂方法(Factory Method)模式,又称多态性工厂(Polymorphic Factory)模式 或虚拟构造子(Virtual Constructor)模式;
抽象工厂(Abstract Factory)模式,又称工具箱(Kit 或Toolkit)模式,产生产品族,但不利于产生新的产品;
这三种模式从上到下逐步抽象,并且更具一般性。

简单工厂模式:

介绍:
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据自变量的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

角色:
工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体Java 类实现。 抽象产品(Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个Java 接口或者Java 抽象类实现。
具体产品(Concrete Product)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java 类实现。

适用环境:
工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂;
客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

package factory;
/*
 * 简单工厂模式
 */
public abstract class Computer {

    public abstract void start();
}
package factory;
/*
 * 简单工厂模式
 */
public class LenovoComputer extends Computer {

    @Override
    public void start() {
        System.out.println("生成联想电脑");
    }

}
package factory;
/*
 * 简单工厂模式
 */
public class HpComputer extends Computer{

    @Override
    public void start() {
        System.out.println("生成惠普电脑");
    }

}
package factory;
/*
 * 简单工厂模式
 */
public class AsusComputer extends Computer{

    @Override
    public void start() {
        System.out.println("生成华硕电脑");
    }

}
package factory;
/*
 * 简单工厂模式
 */
public class ComputerFactory {

    public static Computer creatComputer(String type){
        Computer computer = null;
        switch(type){
        case "hp": 
            computer = new HpComputer();
            break;
        case "lenovo": 
            computer = new LenovoComputer();
            break;
        case "asus": 
            computer = new AsusComputer();
            break;
        }
        return computer;        
    }

}
package factory;
/*
 * 简单工厂模式
 */
public class CreatComputer {

    public static void main(String[] args) {
        ComputerFactory.creatComputer("asus").start();
        ComputerFactory.creatComputer("hp").start();
        ComputerFactory.creatComputer("asus").start();
        ComputerFactory.creatComputer("lenovo").start();
        ComputerFactory.creatComputer("asus").start();
    }
}

工厂方法模式:

介绍:
工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method是一个类的实例化延迟到其子类。
在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

角色:
抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。在上面的系统中这个角色由Java 接口Creator 扮演;在实际的系统中,这个角色也常常使用抽象Java 类实现。
具体工厂(Concrete Creator)角色:担任这个角色的是实现了抽象工厂接口的具体Java 类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。在本系统中给出了两个这样的角色,也就是具体Java类ConcreteCreator1 和ConcreteCreator2。
抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在本系统中,这个角色由Java 接口Product 扮演;在实际的系统中,这个角色也常常使用抽象Java 类实现。
具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。

适用环境:
一个类不知道它所需要的对象的类:在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建;客户端需要知道创建具体产品的工厂类。
一个类通过其子类来指定创建哪个对象:在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无需关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。

package factory;
/*
 * 工厂方法模式
 */
public interface Human {

    public void getColor();//皮肤颜色
    public void getTalk();//语言

}
package factory;
/*
 * 工厂方法模式
 */
public class BlackHuman implements Human {

    @Override
    public void getColor() {
        System.out.println("黑人是黑色的皮肤");
    }

    @Override
    public void getTalk() {
        System.out.println("黑人说的是非洲言语");
    }

}
package factory;
/*
 * 工厂方法模式
 */
public class YelloHuman implements Human{

    @Override
    public void getColor() {
        System.out.println("黄人是黄色皮肤");
    }

    @Override
    public void getTalk() {
        System.out.println("黄人说的是汉语");
    }

}
package factory;
/*
 * 工厂方法模式
 */
public class WhiteHuam implements Human{

    @Override
    public void getColor() {
        System.out.println("白人是白色皮肤");
    }

    @Override
    public void getTalk() {
        System.out.println("白人说的是英语");
    }

}
package factory;
/*
 * 工厂方法模式
 */
public abstract class AbstractHumanFactory {
    public abstract <T extends Human> T creatHuman(Class<T> c);
}
package factory;
/*
 * 工厂方法模式
 */
public class HumanFactory extends AbstractHumanFactory{

    @Override
    public <T extends Human> T creatHuman(Class<T> c) {
        Human human = null;
        try {
            human = (Human) Class.forName(c.getName()).newInstance();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return (T) human;
    }

}
package factory;
/*
 * 工厂方法模式
 */
public class CreatHuman {

    public static void main(String[] args) {

        AbstractHumanFactory abstractHumanFactory = new HumanFactory();
        Human whiteHuman = abstractHumanFactory.creatHuman(WhiteHuam.class);//创造白色人种
        whiteHuman.getColor();
        whiteHuman.getTalk();
        Human yelloHuman = abstractHumanFactory.creatHuman(YelloHuman.class);//创造黄色人种
        yelloHuman.getColor();
        yelloHuman.getTalk();
        Human blackHuman = abstractHumanFactory.creatHuman(BlackHuman.class);//创造黑色人种
        blackHuman.getColor();
        blackHuman.getTalk();

    }

}

抽象工厂模式:

介绍:
抽象工厂模式提供一个创建一系列或相互依赖的对象的接口,而无需指定它们具体的类。

角色:
抽象工厂(AbstractFactory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用Java 接口或者抽象Java 类实现,而所有的具体工厂类必须实现这个Java 接口或继承这个抽象Java 类。
具体工厂类(Conrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。通常使用具体Java 类实现这个角色。
抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用Java 接口或者抽象Java 类实现这一角色。
具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。通常使用具体Java 类实现这个角色。

适用环境:
一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节。这对于所有形态的工厂模式都是重要的;
一个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品;
同属于同一个产品族的产品是在一起使用的,这一约束必须要在系统的设计中体现出来; 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

package factory;
/*
 * 抽象工厂模式
 */
public abstract class Phone{


    protected String model;//手机型号 

    protected String name;//手机名字 

    // 构造器  
    public Phone(String name,String model) {  
        this.name = name;  
        this.model = model;  
    }

    public abstract void call();
}
package factory;
/*
 * 抽象工厂模式
 */
public class HuaWei extends Phone{

    public HuaWei(String name, String model) {
        super(name, model);
    }

    @Override
    public void call() {
        System.out.println(name+" "+model);
        System.out.println("华为呼叫");
    }

}
package factory;
/*
 * 抽象工厂模式
 */
public class Vivo extends Phone{

    public Vivo(String name, String model) {
        super(name, model);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void call() {
        System.out.println(name+" "+model);
        System.out.println("vovi呼叫");
    }

}
package factory;
/*
 * 抽象工厂模式
 */
public class Oppo extends Phone{

    public Oppo(String name, String model) {
        super(name, model);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void call() {
        System.out.println(name+" "+model);
        System.out.println("oppo呼叫");
    }

}
package factory;
/*
 * 抽象工厂模式
 */
public abstract class AbstractPhoneFactory {
    public abstract Phone creatHuaWei();//生产华为手机
    public abstract Phone creatVivo();//生产vivo手机
    public abstract Phone creatOppo();//生产oppo手机

}
package factory;
/*
 * 抽象工厂模式
 */
public class PhoneFactory extends AbstractPhoneFactory{

    @Override
    public Phone creatHuaWei() {
        // TODO Auto-generated method stub
        return new HuaWei("华为","1001");
    }

    @Override
    public Phone creatVivo() {
        // TODO Auto-generated method stub
        return new Vivo("Vivo", "1002");
    }

    @Override
    public Phone creatOppo() {
        // TODO Auto-generated method stub
        return new Oppo("oppo", "1003");
    }

}
package factory;
/*
 * 抽象工厂模式
 */
public class CreatPhone {

    public static void main(String[] args) {
        AbstractPhoneFactory abstractPhoneFactory = new PhoneFactory();
        Phone phone1 = abstractPhoneFactory.creatHuaWei();
        phone1.call();
        Phone phone2 = abstractPhoneFactory.creatVivo();
        phone2.call();
        Phone phone3 = abstractPhoneFactory.creatOppo();
        phone3.call();
    }

}

请关注“知了堂学习社区”,地址:http://www.zhiliaotang.com/portal.php

了课是一个在线教育平台,提供了丰富多样的课程内容。其中,flask web是其中一门非常受欢迎的课程。 Flask是一个基于Python语言开发的轻量级Web应用框架。它简洁易用,但功能强大,因此在Web开发中被广泛应用。Flask Web课程旨在教授学员如何使用Flask框架构建自己的Web应用程序。 在Flask Web课程中,学员将学习到如何搭建一个完整的Web应用程序。首先,课程会介绍Flask框架的基本概念和使用方法,学员将了解如何创建Flask应用和处理路由。接着,课程会涵盖数据库的使用,学员将学会如何与数据库进行交互,以存储和检索数据。 此外,Flask Web课程还会教授学员如何处理表单数据和用户认证。表单是Web应用中常见的用户输入形式,学员将学习如何处理表单数据,并对用户输入进行验证和处理。同时,课程还会介绍用户认证和授权的方法,以确保只有授权用户可以访问特定的页面或功能。 在课程的实践部分,学员将有机会建立自己的Web应用程序。通过完成一系列的编程任务和项目,学员将应用所学的识,并将其运用到实际项目中。 总之,了课的Flask Web课程是一门全面而实践性强的课程,旨在帮助学员掌握使用Flask框架构建Web应用程序的技能。无论是对于想要从事Web开发的人来说,还是对于已经有一定经验的开发者来说,这门课程都将带来很大的收益。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值