之前我们创建类对象是,都是使用new对象的形式创建,在很多业务场景下也提供了不直接new的方式
工厂模式(Factory Pattern) 是java中最常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种获取对象的方式。
工厂的方法可以封装对象的创建细节,比如:为该对象进行加工和数据注入
可以实现类与类之间的解耦合操作(核心思想)
- package 工厂模式;
-
- /**
- * 手机类
- */
-
- public abstract class Phone {
- private String name;//手机品牌
- private double price;//价格
- public abstract void start();
- /**
- * @return the name
- */
- public String getName() {
- return name;
- }
- /**
- * @param name the name to set
- */
- public void setName(String name) {
- this.name = name;
- }
- /**
- * @return the price
- */
- public double getPrice() {
- return price;
- }
- /**
- * @param price the price to set
- */
- public void setPrice(double price) {
- this.price = price;
- }
- public Phone(String name, double price) {
- super();
- this.name = name;
- this.price = price;
- }
- public Phone() {
- super();
- }
-
-
- }
- package 工厂模式;
-
- public class Iphone extends Phone {
-
- @Override
- public void start() {
- // TODO Auto-generated method stub
- System.out.println(super.getName()+"手机启动了");
-
- }
-
- }
- package 工厂模式;
-
- public class HuaWei extends Phone{
-
- @Override
- public void start() {
- // TODO Auto-generated method stub
- System.out.println(super.getName()+"手机很快的启动了");
-
- }
-
- }
创建一个工厂
- package 工厂模式;
-
- public class PhoneFactory {
- public static Phone creatPhone (String name) {
- switch (name) {
- case "huawei":
- Phone h1=new HuaWei();
- h1.setName("华为");
- h1.setPrice(5999);;
- return h1;
- case"iPhone":
- Phone p1=new Iphone();
- p1.setName("苹果");
- p1.setPrice(9999);
-
- return p1;
-
- default:
- return null;
- }
-
- }
-
- }
测试对象
- package 工厂模式;
-
- public class Test {
-
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Phone p1=PhoneFactory.creatPhone("iPhone");
- p1.start();//苹果启动了
-
-
- }
-
- }
创建一个新类,包装原始类,从而在新类中提升原来类的功能
装饰设计模式的作用?
例如:
InputStream(抽象父类)
FileInputStream(实现子类,读写性能较差)
BufferedInputStream(实现子类,装饰类,读写性能搞)
定义父类
定义原始类,继承父类,定义功能
定义装饰类,继承父类,包装原始类,增强功能
做一个模拟
- package 装饰模式;
-
- /**
- * 共同的抽象父类
- */
- public abstract class ComFather {
- public abstract String read(String s);
- public abstract String read(byte[] buffer);
-
-
- }
原始管道
- package 装饰模式;
-
- import java.util.Arrays;
-
- /**
- *原始类
- */
- public class Original extends ComFather {
-
- @Override
- public String read(String s) {
- System.out.println("我是原始管道,读的很慢我读了"+s);
- return null;
- }
-
- @Override
- public String read(byte[] buffer) {
- System.out.println("我是原始管道,读取字节数组:"+Arrays.toString(buffer));
- return null;
- }
-
- }
装饰管道
- package 装饰模式;
-
- /**
- * 原始功能升级版
- */
- public class Pro extends ComFather {
- private ComFather org;
- public Pro(ComFather org) {
- this.org=org;
- }
-
- @Override
- public String read(String s) {
- System.out.println("装饰管道已经为你加强!");
- return org.read(s);
- }
-
- @Override
- public String read(byte[] buffer) {
- System.out.println("装饰管道已经为你加强,更快的读字节数组把");
- return org.read(buffer);
- }
-
- }
测试一下
- package 装饰模式;
-
- public class Test {
- public static void main(String[] args) {
- ComFather c=new Original();
- c.read("666");//原始管道读
- Pro p=new Pro(c);
- p.read("000000000000");
-
- }
-
- }
最后输出
我是原始管道,读的很慢我读了666
装饰管道已经为你加强!
我是原始管道,读的很慢我读了000000000000